I have been toying with the modulino perl pattern and would like to load one without knowing the package name and only the file in which it is. I'm looking for something that could be used like this:
eval {
my $file = "some-file-name-in-the-hierarchy-unrelated-to-package-name";
my $module = something($file);
$module->sub1();
};
The something
here is the key. No require
or use
since I would need the module name afterwards. Do I have to read the $file
and parse the package
name out of it to then use it? There might a better way I'm sure. There always is in perl.
Which of the files do you control? If you are creating the program as a modulino and then trying to load that file, just make the last statement in the file return the package name. require expects you to return a true value and most modules use 1;
. However, you can use any true value you like. This will be the return value of require:
# i_dont_know_whats_inside
package Buster;
__PACKAGE__;
Loading it is easy:
my $package = require 'i_dont_know_whats_inside';
print "Package is $package\n";
$package->new( ... );
If you can't control the file you're loading, it's not that hard to find out what's inside:
my @packages = load_file( 'i_dont_know_whats_inside' );
print "Packages are @packages\n";
sub load_file {
my $file = shift;
require Module::Extract::Namespaces;
my @packages = Module::Extract::Namespaces->from_file( $file );
my $rc = require $file;
return @packages;
}