X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit%2FImport-Into.git;a=blobdiff_plain;f=lib%2FImport%2FInto.pm;h=1e4fb75389b09f74a7c7d429f449a437775acc72;hp=71f1507e8734d4fedbdd1221cca0b503006f060f;hb=f48235dbfef2a091bf976aef3794e64b0b537f41;hpb=074eb8db7f15cce684ce9645cb1138d721ddd64e diff --git a/lib/Import/Into.pm b/lib/Import/Into.pm index 71f1507..1e4fb75 100644 --- a/lib/Import/Into.pm +++ b/lib/Import/Into.pm @@ -2,8 +2,9 @@ package Import::Into; use strict; use warnings FATAL => 'all'; +use Module::Runtime; -our $VERSION = '1.001001'; # 1.1.1 +our $VERSION = '1.002004'; sub _prelude { my $target = shift; @@ -24,8 +25,9 @@ sub _prelude { sub _make_action { my ($action, $target) = @_; my $version = ref $target && $target->{version}; - my $ver_check = $version ? '$_[0]->VERSION($version);' : ''; - eval _prelude($target).qq{sub { $ver_check shift->$action(\@_) }} + my $ver_check = $version ? ', $version' : ''; + eval _prelude($target) + . qq{sub { Module::Runtime::use_module( shift$ver_check )->$action(\@_) }} or die "Failed to build action sub to ${action} for ${target}: $@"; } @@ -40,10 +42,12 @@ sub unimport::out_of { } 1; - + +__END__ + =head1 NAME -Import::Into - import packages into other packages +Import::Into - Import packages into other packages =head1 SYNOPSIS @@ -51,9 +55,6 @@ Import::Into - import packages into other packages use Import::Into; - use Thing1 (); - use Thing2 (); - # simple sub import { Thing1->import::into(scalar caller); @@ -83,11 +84,10 @@ Import::Into - import packages into other packages Thing1->unimport::out_of(scalar caller); } -You don't need to do anything more clever than this provided you -document that people wanting to re-export your module should also be using -L. +People wanting to re-export your module should also be using L. +Any exporter or pragma will work seamlessly. -Note: You do B need to make ayny changes to Thing1 to be able to call +Note: You do B need to make any changes to Thing1 to be able to call C on it. This is a global method, and is callable on any package (and in fact on any object as well, although it's rarer that you'd want to do that). @@ -108,10 +108,11 @@ C provides global methods to make this painless. =head2 $package->import::into( $target, @arguments ); -A global method, callable on any package. Imports the given package into -C<$target>. C<@arguments> are passed along to the package's import method. +A global method, callable on any package. Loads and imports the given package +into C<$target>. C<@arguments> are passed along to the package's import method. -C<$target> can be an package name to export to, an integer for the caller level to export to, or a hashref with the following options: +C<$target> can be an package name to export to, an integer for the +caller level to export to, or a hashref with the following options: =over 4 @@ -121,25 +122,32 @@ The target package to export to. =item filename -The apparent filename to export to. Some exporting modules, such as L or L, care about the filename they are being imported to. +The apparent filename to export to. Some exporting modules, such as +L or L, care about the filename they are being imported +to. =item line -The apparent line number to export to. To be combined with the C option. +The apparent line number to export to. To be combined with the C +option. =item level -The caller level to export to. This will automatically populate the C, C, and C options, making it the easiest most constent option. +The caller level to export to. This will automatically populate the +C, C, and C options, making it the easiest most +constent option. =item version -A version number to check for the module. The equivalent of specifying the version number on a C line. +A version number to check for the module. The equivalent of specifying the +version number on a C line. =back =head2 $package->unimport::out_of( $target, @arguments ); -Equivalent to C, but dispatches to C<$package>'s C method instead of C. +Equivalent to C, but dispatches to C<$package>'s C +method instead of C. =head1 WHY USE THIS MODULE @@ -183,7 +191,8 @@ an exporter and a pragma. So, a solution for that is: - my $sub = eval "package $target; sub { shift->import(\@_) }"; + use Module::Runtime; + my $sub = eval "package $target; sub { use_module(shift)->import(\@_) }"; $sub->($thing, @import_args); which means that import is called from the right place for pragmas to take @@ -200,10 +209,13 @@ in the directive then need to be fetched using C: my $sub = eval qq{ package $target; #line $line "$file" - sub { shift->import(\@_) } + sub { use_module(shift)->import(\@_) } }; $sub->($thing, @import_args); +And you need to switch between these implementations depending on if you are +targeting a specific package, or something in your call stack. + Remembering all this, however, is excessively irritating. So I wrote a module so I didn't have to anymore. Loading L creates a global method C which you can call on any package to import it into another @@ -240,15 +252,12 @@ For more craziness of this order, have a look at the article I wrote at L which covers coderef abuse and the C<${\...}> syntax. -Final note: You do still need to ensure that you already loaded C<$thing> - if -you're receiving this from a parameter, I recommend using L: - - use Import::Into; - use Module::Runtime qw(use_module); +And that's it. - use_module($thing)->import::into($target, @import_args); +=head1 SEE ALSO -And that's it. +I gave a lightning talk on this module (and L and L) at +L. =head1 ACKNOWLEDGEMENTS @@ -264,6 +273,8 @@ mst - Matt S. Trout (cpan:MSTROUT) haarg - Graham Knop (cpan:HAARG) +Mithaldu - Christian Walde (cpan:MITHALDU) + =head1 COPYRIGHT Copyright (c) 2012 the Import::Into L and L @@ -273,3 +284,5 @@ as listed above. This library is free software and may be distributed under the same terms as perl itself. + +=cut