1 package Package::Variant;
10 my $last = (split '::', $target)[-1];
12 my $variable = $target;
15 $Variable{$variable} = {
19 map +($_ => sub {}), @{$args{subs}||[]},
22 *{"${target}::import"} = sub {
25 *{"${target}::${last}"} = sub {
26 $me->build_variant_of($variable, @_);
29 my $subs = $Variable{$variable}{subs};
30 foreach my $name (keys %$subs) {
31 *{"${target}::${name}"} = sub {
32 goto &{$subs->{$name}}
35 *{"${target}::install"} = sub {
36 goto &{$Variable{$variable}{install}};
40 sub build_variant_of {
41 my ($me, $variable, @args) = @_;
42 my $variant_name = "${variable}::_Variant_".++$Variable{$variable}{anon};
43 my @to_import = keys %{$Variable{$variable}{args}{importing}||{}};
44 my $setup = join("\n", "package ${variant_name};", (map "use $_;", @to_import), "1;");
46 or die "evaling ${setup} failed: $@";
47 my $subs = $Variable{$variable}{subs};
48 local @{$subs}{keys %$subs} = map $variant_name->can($_), keys %$subs;
49 local $Variable{$variable}{install} = sub {
50 my ($name, $ref) = @_;
52 *{"${variant_name}::${name}"} = $ref;
54 $variable->make_variant($variant_name, @args);