package LoadModule; use strict; use warnings; my $wantedPackages; my $INC_LOADED; sub import { my $pkg = shift; my ($module, $version) = @_; $wantedPackages->{$module} = $version; push(@INC, \&loadLib) unless($INC_LOADED); $INC_LOADED = 1; } sub loadLib { my ($codeRef, $filename) = @_; my $moduleName = $filename; # Strip the implied pm $moduleName =~ s/\.pm$//; if(exists $wantedPackages->{$moduleName}) { my $package = $moduleName . "-" . $wantedPackages->{$moduleName} . ".pm"; if(-e "./lib/$package") { my $fh; open($fh, "<", "./lib/$package") || die "Can't open ./lib/$package: $!"; return($fh); } } else { return undef; } } 1; #### package TestModule1; use LoadModule MyLib => 'v1'; use MyLib; sub doPrint { MyLib::foo(); } 1; #### lib/MyLib-v1.pm and lib/MyLib-v2.pm