Subject: | merging of group arguments does not work for group generators |
Hi,
in a setup with nested groups, where the "inner" group is a group
generator, like this:
package MyPackage;
use Sub::Exporter -setup => {
groups => {
inner => \&group_generator,
outer => [':inner'],
},
};
when importing the "outer" group with arguments:
use MyPackage -outer => { foo => 'bar' };
then these arguments are not passed to group_generator(), although they
should.
It looks to me that the bug is on line 489 in Sub/Exporter.pm. The value
passed to the generator should be $merge, not $group_args (which has
already been merged into $merge, anyway).
I have attached a patch against v0.979 (with test case) which fixes the
issue for me.
Regards,
Stanis
Subject: | group_generator_args.patch |
diff -Naur Sub-Exporter-0.979.orig/lib/Sub/Exporter.pm Sub-Exporter-0.979/lib/Sub/Exporter.pm
--- Sub-Exporter-0.979.orig/lib/Sub/Exporter.pm 2008-04-29 12:28:03.000000000 +0200
+++ Sub-Exporter-0.979/lib/Sub/Exporter.pm 2008-08-31 16:26:02.000000000 +0200
@@ -486,7 +486,7 @@
# I'm not very happy with this code for hiding -prefix and -suffix, but
# it's needed, and I'm not sure, offhand, how to make it better.
# -- rjbs, 2006-12-05
- my $group_arg = $group_arg ? { %$group_arg } : {};
+ my $group_arg = $merge ? { %$merge } : {};
delete $group_arg->{-prefix};
delete $group_arg->{-suffix};
diff -Naur Sub-Exporter-0.979.orig/t/group-generator.t Sub-Exporter-0.979/t/group-generator.t
--- Sub-Exporter-0.979.orig/t/group-generator.t 2007-08-17 16:56:27.000000000 +0200
+++ Sub-Exporter-0.979/t/group-generator.t 2008-08-31 16:28:59.000000000 +0200
@@ -12,7 +12,7 @@
# XXX: The framework is stolen from expand-group. I guess it should be
# factored out. Whatever. -- rjbs, 2006-03-12
-use Test::More tests => 10;
+use Test::More tests => 12;
BEGIN { use_ok('Sub::Exporter'); }
@@ -41,6 +41,7 @@
alphabet => sub { { A => $alfa, b => $bravo } },
broken => sub { [ qw(this is broken because it is not a hashref) ] },
generated => $returner,
+ nested => [qw( :generated )],
},
collectors => [ 'col1' ],
};
@@ -155,3 +156,28 @@
);
}
}
+
+{
+ my $got = Sub::Exporter::_expand_groups(
+ 'Class',
+ $config,
+ [ [ -nested => { xyz => 1 } ] ],
+ { col1 => { value => 2 } },
+ );
+
+ my %code = map { $_->[0] => $_->[1] } @$got;
+
+ for (qw(foo bar)) {
+ is_deeply(
+ $code{$_}->(),
+ {
+ name => $_,
+ class => 'Class',
+ group => 'generated',
+ arg => { xyz => 1 },
+ collection => { col1 => { value => 2 } },
+ },
+ "generated foo (via nested group) does what we expect",
+ );
+ }
+}