X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FPackage%2FVariant.pm;h=7313a7fa98b6528dcf7677654da2053b832232e0;hb=1bacb018c6f5cac16afc1056028741bcf855a303;hp=977f76c786a545a53bfd1bf438f142ced0711aa0;hpb=203d81fc3c1966d9a28a96987ccf49c2b7bfde97;p=p5sagit%2FPackage-Variant.git diff --git a/lib/Package/Variant.pm b/lib/Package/Variant.pm index 977f76c..7313a7f 100644 --- a/lib/Package/Variant.pm +++ b/lib/Package/Variant.pm @@ -1,7 +1,13 @@ package Package::Variant; use strictures 1; -use Carp qw( croak ); +use Import::Into; +use Module::Runtime qw(use_module); +use Carp qw(croak); + +our $VERSION = '1.000000'; # 1.0.0 + +$VERSION = eval $VERSION; our %Variable; @@ -43,6 +49,10 @@ my $sanitize_importing = sub { return \@imports; }; +my $sub_namer = eval { + require Sub::Name; sub { shift if @_ > 2; Sub::Name::subname(@_) } +} || sub { $_[-1] }; + sub import { my $target = caller; my $me = shift; @@ -84,29 +94,19 @@ sub import { sub build_variant_of { my ($me, $variable, @args) = @_; my $variant_name = "${variable}::_Variant_".++$Variable{$variable}{anon}; - my $import = $Variable{$variable}{args}{importing}; - my $setup = join("\n", - "package ${variant_name};", - (map sprintf( - q!use %s %s;!, - $import->[$_][0], - scalar(@{$import->[$_][1]}) - ? sprintf( - q!@{$import->[%d][1]}!, - $_, - ) - : '', - ), 0..$#$import), - "1;", - ); - eval $setup - or die "evaling ${setup} failed: $@"; + foreach my $to_import (@{$Variable{$variable}{args}{importing}}) { + my ($pkg, $args) = @$to_import; + use_module($pkg)->import::into($variant_name, @{$args}); + } my $subs = $Variable{$variable}{subs}; local @{$subs}{keys %$subs} = map $variant_name->can($_), keys %$subs; local $Variable{$variable}{install} = sub { - my ($name, $ref) = @_; + my $full_name = "${variant_name}::".shift; + + my $ref = $sub_namer->($full_name, @_); + no strict 'refs'; - *{"${variant_name}::${name}"} = $ref; + *$full_name = $ref; }; $variable->make_variant($variant_name, @args); return $variant_name; @@ -275,6 +275,11 @@ arguments as a flat array reference: The import method will be called even if the list of import arguments is empty or not specified, +If you just want to import a single package's default exports, you can +also pass a string instead: + + use PAckage::Variant importing => 'Package'; + =head2 subs An array reference of strings listing the names of subroutines that should @@ -359,15 +364,16 @@ method. =head1 AUTHOR -=over +mst - Matt S. Trout (cpan:MSTROUT) -=item mst - Matt S. Trout (cpan:MSTROUT) +=head1 CONTRIBUTORS -=back +phaylon - Robert Sedlacek (cpan:PHAYLON) =head1 COPYRIGHT -Copyright (c) 2010-2011 the C L as listed above. +Copyright (c) 2010-2011 the C L and +L as listed above. =head1 LICENSE