X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FImport%2FInto.pm;h=a9f4a6cfdc9013e2a19bc71cfecb6965a8b3a8c3;hb=5f5f09b18af4987858e59a00204ceb49ff6f8ed0;hp=a3c56528e427032b595010f8662f8a6b3310eafb;hpb=95ecfed2dfe247f1cb4cba0edd6cb2f706fdc930;p=p5sagit%2FImport-Into.git diff --git a/lib/Import/Into.pm b/lib/Import/Into.pm index a3c5652..a9f4a6c 100644 --- a/lib/Import/Into.pm +++ b/lib/Import/Into.pm @@ -5,25 +5,28 @@ use warnings FATAL => 'all'; our $VERSION = '1.001001'; # 1.1.1 -my %importers; - -sub _importer { +sub _prelude { my $target = shift; - \($importers{$target} ||= eval qq{ - package $target; - sub { my \$m = splice \@_, 1, 1; shift->\$m(\@_) }; - } or die "Couldn't build importer for $target: $@") + my ($package, $file, $line) + = $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) = @_; - $class->${_importer($target)}(import => @args); + _make_action(import => $target)->($class, @args); } sub unimport::out_of { my ($class, $target, @args) = @_; - $class->${_importer($target)}(unimport => @args); + _make_action(unimport => $target)->($class, @args); } 1; @@ -193,7 +196,7 @@ mst - Matt S. Trout (cpan:MSTROUT) =head1 CONTRIBUTORS -None yet - maybe this software is perfect! (ahahahahahahahahaha) +haarg - Graham Knop (cpan:HAARG) =head1 COPYRIGHT