sub _prelude {
my $target = shift;
- my ($package, $file, $line)
- = $target =~ /[^0-9]/ ? ($target) : caller($target + 2);
+ my ($package, $file, $line, $level)
+ = ref $target ? @{$target}{qw(package filename line)}
+ : $target =~ /[^0-9]/ ? ($target)
+ : (undef, undef, undef, $target);
+ if (defined $level) {
+ my ($p, $fn, $ln) = caller($level + 2);
+ $package ||= $p;
+ $file ||= $fn;
+ $line ||= $ln;
+ }
qq{package $package;\n}
. ($file ? "#line $line \"$file\"\n" : '')
}
sub _make_action {
my ($action, $target) = @_;
- eval _prelude($target).qq{sub { shift->$action(\@_) }}
+ my $version = ref $target && $target->{version};
+ my $ver_check = $version ? '$_[0]->VERSION($version);' : '';
+ eval _prelude($target).qq{sub { $ver_check shift->$action(\@_) }}
or die "Failed to build action sub to ${action} for ${target}: $@";
}
warnings->import::into($target);
MyExporter->import::into($target, 'thing');
CheckFile->import::into(1);
+
}
$INC{"MultiExporter.pm"} = 1;
}
my @checkcaller;
+my $checkversion;
BEGIN {
package CheckFile;
sub import {
@checkcaller = caller;
}
+ sub VERSION {
+ $checkversion = $_[1];
+ }
$INC{"CheckFile.pm"} = 1;
}
is $checkcaller[0], 'TestPackage', 'import by level has correct package';
is $checkcaller[1], __FILE__, 'import by level has correct file';
is $checkcaller[2], 1, 'import by level has correct line';
+
+CheckFile->import::into({
+ package => 'ExplicitPackage',
+ filename => 'explicit-file.pl',
+ line => 42,
+ version => 219,
+});
+
+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';