X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FPackage%2FVariant.pm;h=ed18fcd4ee2ff235563f35e6e960c0dd43bba18e;hb=853b69617ddc8330ed6454ac021361b0ef3ad1a4;hp=fca5a493f7dad1b3ac5e15605b3f80e603187aa8;hpb=328258e027e8c41f5c23ddc061d69fde923138f4;p=p5sagit%2FPackage-Variant.git diff --git a/lib/Package/Variant.pm b/lib/Package/Variant.pm index fca5a49..ed18fcd 100644 --- a/lib/Package/Variant.pm +++ b/lib/Package/Variant.pm @@ -2,10 +2,10 @@ package Package::Variant; use strictures 1; use Import::Into; -use Module::Runtime qw(use_module); +use Module::Runtime qw(require_module); use Carp qw(croak); -our $VERSION = '1.001004'; # 1.1.4 +our $VERSION = '1.002000'; # 1.2.0 $VERSION = eval $VERSION; @@ -54,11 +54,10 @@ my $sub_namer = eval { } || sub { $_[-1] }; sub import { - my $target = caller; + my $variable = caller; my $me = shift; - my $last = (split '::', $target)[-1]; + my $last = (split '::', $variable)[-1]; my $anon = 'A000'; - my $variable = $target; my %args = @_; no strict 'refs'; $Variable{$variable} = { @@ -71,7 +70,7 @@ sub import { map +($_ => sub {}), @{$args{subs}||[]}, }, }; - *{"${target}::import"} = sub { + *{"${variable}::import"} = sub { my $target = caller; my (undef, %arg) = @_; my $as = defined($arg{as}) ? $arg{as} : $last; @@ -82,13 +81,17 @@ sub import { }; my $subs = $Variable{$variable}{subs}; foreach my $name (keys %$subs) { - *{"${target}::${name}"} = sub { + *{"${variable}::${name}"} = sub { goto &{$subs->{$name}} }; } - *{"${target}::install"} = sub { + *{"${variable}::install"} = sub { goto &{$Variable{$variable}{install}}; - } + }; + *{"${variable}::build_variant"} = sub { + shift; + $me->build_variant_of($variable, @_); + }; } sub build_variant_of { @@ -96,7 +99,9 @@ sub build_variant_of { my $variant_name = "${variable}::_Variant_".++$Variable{$variable}{anon}; foreach my $to_import (@{$Variable{$variable}{args}{importing}}) { my ($pkg, $args) = @$to_import; - use_module($pkg)->import::into($variant_name, @{$args}); + require_module $pkg; + eval q{ BEGIN { $pkg->import::into($variant_name, @{$args}) }; 1; } + or die $@; } my $subs = $Variable{$variable}{subs}; local @{$subs}{keys %$subs} = map $variant_name->can($_), keys %$subs; @@ -327,6 +332,16 @@ Exports the generator subroutine under a different name than the default. =back +=head2 build_variant + + use Some::Variant::Package (); + my $variant_package = Some::Variant::Package->build_variant( @arguments ); + +This method is provided for you. It will generate a variant package +and return its name, just like the generator sub provided by +L. This allows you to avoid importing anything into the +consuming package. + =head1 C METHODS These methods are available on C itself.