Search code examples
perlmodulino

Load and use perl module without knowing the module name but knowing the file name


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.


Solution

  • 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;
        }