X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FPackage%2FVariant.pm;h=b0c269893ce2de4737d03b73fc6d5a975de1a9fb;hb=0a7db8d2582be4949a5c321ac449ff6c2e1c1e03;hp=c99e24fc0b68350918768c4310331d4acb068c75;hpb=0c3783521566af1a822621423f57f1465b39f4c6;p=p5sagit%2FPackage-Variant.git diff --git a/lib/Package/Variant.pm b/lib/Package/Variant.pm index c99e24f..b0c2698 100644 --- a/lib/Package/Variant.pm +++ b/lib/Package/Variant.pm @@ -21,8 +21,10 @@ sub import { }; *{"${target}::import"} = sub { my $target = caller; + my (undef, %arg) = @_; + my $as = defined($arg{as}) ? $arg{as} : $last; no strict 'refs'; - *{"${target}::${last}"} = sub { + *{"${target}::${as}"} = sub { $me->build_variant_of($variable, @_); }; }; @@ -40,8 +42,14 @@ sub import { sub build_variant_of { my ($me, $variable, @args) = @_; my $variant_name = "${variable}::_Variant_".++$Variable{$variable}{anon}; - my @to_import = keys %{$Variable{$variable}{args}{importing}||{}}; - my $setup = join("\n", "package ${variant_name};", (map "use $_;", @to_import), "1;"); + my $import = $Variable{$variable}{args}{importing} || {}; + my $setup = join("\n", + "package ${variant_name};", + (map sprintf( + q!use %s @{$import->{'%s'}||[]};!, $_, quotemeta($_), + ), keys %$import), + "1;", + ); eval $setup or die "evaling ${setup} failed: $@"; my $subs = $Variable{$variable}{subs}; @@ -170,7 +178,8 @@ your package. use My::Variant; my $new_variant_package = Variant( @variant_arguments ); -The package is now fully initialized and used. +The package is now fully initialized and used. You can import the +subroutine under a different name by specifying an C argument. =head2 Dynamic creation of variant packages @@ -233,6 +242,19 @@ This method is provided for you. It will allow a user to C your package and receive a subroutine taking C<@arguments> defining the variant and returning the name of the newly created variant package. +The following options can be specified when importing: + +=over + +=item * B + + use Some::Variant::Package as => 'Foo'; + my $variant_package = Foo( @arguments ); + +Exports the generator subroutine under a different name than the default. + +=back + =head1 C METHODS These methods are available on C itself.