How can I wrap require and use?
BEGIN {
unshift @INC, sub {
printf "%s -> %s\n", ( caller() )[0], $_[1];
return;
};
}
See the paragraph starting with "You can also insert hooks into the import facility" in require
's documentation.
You cannot reference the require
builtin as a subroutine such as for goto
, but you can call it from CORE.
use strict;
use warnings;
BEGIN {
*CORE::GLOBAL::require = sub {
printf "%s -> %s\n", [caller()]->[0], $_[0];
CORE::require $_[0];
}
};
use Data::Dumper;
You may also consider Devel::TraceUse which is similar to the above but more robust and informative, and can easily be invoked from the commandline.
You can look inside Devel::TraceUse to see working code for what you are trying to do. But, changing definitions isn't a good plan because you don't know who else also changed definitions and will wonder why their stuff stops working.
You don't need to (or should) override require
. Put a code reference in @INC
and return false at the end so it looks like that failed and Perl will move on to the next thing in @INC
:
#!perl
use v5.10;
# https://stackoverflow.com/a/2541138/2766176
BEGIN {
unshift @INC, sub {
my( $package, $file ) = caller(0);
say "$package -> $_[1]";
return 0;
};
}
use Data::Dumper;
say "Hello";
This outputs:
main -> Data/Dumper.pm
Data::Dumper -> constant.pm
constant -> strict.pm
constant -> warnings/register.pm
warnings::register -> warnings.pm
Data::Dumper -> Carp.pm
Carp -> overloading.pm
Carp -> Exporter.pm
Data::Dumper -> XSLoader.pm
Data::Dumper -> bytes.pm
Hello