From: Graham Knop Date: Sun, 10 Nov 2013 19:52:44 +0000 (-0500) Subject: document implementation of import to level X-Git-Tag: v1.002000~10 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=ba1c5bf061f228d68ebd7b1581563e95df212e8b;p=p5sagit%2FImport-Into.git document implementation of import to level --- diff --git a/lib/Import/Into.pm b/lib/Import/Into.pm index a59ce66..6e8c341 100644 --- a/lib/Import/Into.pm +++ b/lib/Import/Into.pm @@ -136,7 +136,7 @@ know if something's a pragma, and second that you can't use either of these approaches alone on something like L or L that's both an exporter and a pragma. -So, the complete solution is: +So, a solution for that is: my $sub = eval "package $target; sub { shift->import(\@_) }"; $sub->($thing, @import_args); @@ -145,6 +145,20 @@ which means that import is called from the right place for pragmas to take effect, and from the right package for caller checking to work - and so behaves correctly for all types of exporter, for pragmas, and for hybrids. +Additionally, some import routines check the filename they are being imported +to. This can be dealt with by generating a L<#line directive|perlsyn/Plain +Old Comments (Not!)> in the eval, which will change what C reports for +the filename when called in the importer. The filename and line number to use +in the directive then need to be fetched using C: + + my ($terget, $file, $line) = caller(1); + my $sub = eval qq{ + package $target; + #line $line "$file" + sub { shift->import(\@_) } + }; + $sub->($thing, @import_args); + 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