From: Christian Walde Date: Sun, 6 Jul 2014 14:49:55 +0000 (+0200) Subject: module loading is now done while importing, making it unnecessary to load them beforehand X-Git-Tag: v1.002003~6 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=cc0879792c33e271b206a8012112d9250ef04b96;p=p5sagit%2FImport-Into.git module loading is now done while importing, making it unnecessary to load them beforehand --- diff --git a/Changes b/Changes index 36efe25..d895d16 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,8 @@ Revision history for Import-Into + - module loading is now done while importing, making it unnecessary to load + them beforehand + 1.002002 - 2014-05-06 - minor metadata updates diff --git a/Makefile.PL b/Makefile.PL index b427229..f722619 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -30,6 +30,7 @@ WriteMakefile( requires => { 'strict' => '0', 'warnings' => '0', + 'Module::Runtime' => '0', }, }, test => { diff --git a/lib/Import/Into.pm b/lib/Import/Into.pm index 84effea..2bde90c 100644 --- a/lib/Import/Into.pm +++ b/lib/Import/Into.pm @@ -2,6 +2,7 @@ package Import::Into; use strict; use warnings FATAL => 'all'; +use Module::Runtime; our $VERSION = '1.002002'; # 1.2.2 @@ -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}: $@"; } @@ -53,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); @@ -109,8 +108,8 @@ 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: @@ -192,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 @@ -209,7 +209,7 @@ 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); @@ -252,14 +252,6 @@ 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); - - use_module($thing)->import::into($target, @import_args); - And that's it. =head1 SEE ALSO @@ -281,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 diff --git a/t/import_into.t b/t/import_into.t index fcf3c84..066e172 100644 --- a/t/import_into.t +++ b/t/import_into.t @@ -12,6 +12,8 @@ BEGIN { sub thing { 'thing' } + $INC{"MyExporter.pm"} = 1; + package MultiExporter; use Import::Into; @@ -84,3 +86,7 @@ is $checkcaller[0], 'ExplicitPackage', 'import with hash has correct package'; is $checkcaller[1], 'explicit-file.pl', 'import with hash has correct file'; is $checkcaller[2], 42, 'import with hash has correct line'; is $checkversion, 219, 'import with hash has correct version'; + +ok( !IPC::Open3->can("open3"), "IPC::Open3 is unloaded" ); +IPC::Open3->import::into("TestPackage"); +ok( TestPackage->can("open3"), "IPC::Open3 was use'd and import::into'd" );