#!/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, $@";