Hi bliako,
I think that something like this could work
#!/usr/bin/env perl
use strict;
use warnings;
sub updateINC {
my ( $modfn, $code ) = @_ ; # code = ref
push( @INC, sub {
my ( $coderef, $filename ) = @_ ;
if ( $filename eq $modfn ) {
# print STDOUT "########### filename = $filename\n" ;
open( my $fh, '<', $code ) or die "Open Hello failed\n" ;
return $fh ;
}
} ) ;
}
sub load_modules {
my $mod1 = <<'EOM';
package Test::Module::Hello::Hello;
our $VERSION = 0.1;
use strict;
use warnings;
sub go {
return "Hi iam ".__PACKAGE__
}
1;
__END__
EOM
updateINC('Test/Module/Hello/Hello.pm', \$mod1) ;
my $mod2 = <<'EOM';
package Test::Module::Hello::Goodbye;
our $VERSION = 0.1;
use strict;
use warnings;
# >>> This will kill the eval if uncommented
use Test::Module::Hello::Hello;
sub go {
return "Hi iam ".__PACKAGE__
}
1;
__END__
EOM
updateINC('Test/Module/Hello/Goodbye.pm', \$mod2) ;
}
load_modules();
my $testscript = '
# >>> Following use/require will kill the eval
#use Test::Module::Hello::Hello;
require Test::Module::Hello::Goodbye;
my $ret = Test::Module::Hello::Hello::go();
print "ret=$ret\n";
$ret = Test::Module::Hello::Goodbye::go();
print "ret=$ret\n";
';
eval($testscript) or die "eval failed, $@";
I haven't looked at any of the other solutions, so I don't know what is better or not. I just tried it out and it seems to work
I hope this may be of some help to you,
Veltro