[EDIT: My earlier solution involving use Lots::Of::Modules;
had a subtle bug -- see bottom. The fix makes things a bit uglier, but still workable.]
[EDIT #2: Added BEGIN { ... }
around the code to ensure that any functions defined are available at compile time. Thanks to jrockway for pointing this out.]
The following code will do exactly what jrockway's code does, only simpler and clearer:
In Lots/Of/Modules.inc:
use Carp qw/confess cluck/;
use Path::Class qw/file dir/;
0; # Flag an error if called with "use" or "require" instead of "do"
To import those 4 functions:
BEGIN { defined( do 'Lots/Of/Modules.inc' ) or die; }
Because we don't have a package Lots::Of::Modules;
statement at the start of this file, the use
statements will export into the caller's package.
We must use do
instead of use
or require
, since the latter will only load the file once (causing failure if use Lots::Of::Modules;
is called more than once, e.g. in separate modules use
d by the main program). The more primitive do
does not throw an exception if it fails to find the file named by its argument in @INC
, hence the need for checking the result with defined
.