X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FImport%2FInto.pm;h=a59ce66ecb260d2ff6862e5b4e81851e5e10a646;hb=9f39bd722eb803aeff0b567a10b921daa4f36448;hp=3314ec347c0ea798ac3941969e94603e3ed8db09;hpb=324e7017c37f3ba326a3c04af62067aa1d561f03;p=p5sagit%2FImport-Into.git diff --git a/lib/Import/Into.pm b/lib/Import/Into.pm index 3314ec3..a59ce66 100644 --- a/lib/Import/Into.pm +++ b/lib/Import/Into.pm @@ -8,21 +8,25 @@ our $VERSION = '1.001001'; # 1.1.1 sub _prelude { my $target = shift; my ($package, $file, $line) - = $target =~ /[^0-9]/ ? ($target) : caller($target + 1); + = $target =~ /[^0-9]/ ? ($target) : caller($target + 2); qq{package $package;\n} . ($file ? "#line $line \"$file\"\n" : '') } +sub _make_action { + my ($action, $target) = @_; + eval _prelude($target).qq{sub { shift->$action(\@_) }} + or die "Failed to build action sub to ${action} for ${target}: $@"; +} + sub import::into { my ($class, $target, @args) = @_; - eval _prelude($target) . '$class->import(@args); 1' - or die $@; + _make_action(import => $target)->($class, @args); } sub unimport::out_of { my ($class, $target, @args) = @_; - eval _prelude($target) . '$class->unimport(@args); 1' - or die $@; + _make_action(unimport => $target)->($class, @args); } 1; @@ -39,11 +43,13 @@ Import::Into - import packages into other packages use Thing1 (); use Thing2 (); + use Thing3 (); sub import { my $target = caller; Thing1->import::into($target); Thing2->import::into($target, qw(import arguments)); + Thing3->import::into(1); # import to level } Note: you don't need to do anything more clever than this provided you @@ -69,6 +75,11 @@ 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). +If you provide C with an integer instead of a package name, it +will be used as the number of stack frames to skip to find where to export to. +This has the advantage of preserving the apparent filename and line number +being exported to, which some modules (L, L) check. + Finally, we also provide an C to allow the exporting of the effect of C: