use strict; { package FP; sub foo{}; } package GP; { sub subtest1{return 'Global Test 1';} sub subtest2{return 'Global Test 2';} } package LP; { sub subtest1{return 'Local Test 1';} } { package AP; use base qw(FP LP GP); } #delete_FP(0); my $FP = 'test1.lib'; require $FP; print "test1.lib\n"; print GP::subtest1() . "\n"; # uses GP print FP::subtest1() . "\n"; # use FP subs defined in test1.lib print AP->subtest1() . "\n"; # as previous print AP->subtest2() . "\n"; # uses GP as this sub only defined there print AP->subtest3() . "\n"; # this sub won't exist in a moment... delete_FP($FP); $FP = 'test2.lib'; require $FP; print "\ntest2.lib\n"; print FP::subtest1() . "\n"; # uses FP subs defined in test2.lib print AP->subtest1() . "\n"; # as previous print AP->subtest3() . "\n"; # this sub now doesn't exist... sub delete_FP{ no strict 'refs'; my $class = 'FP'; my $symtab = $class . '::'; # Delete all symbols except other namespaces for my $symbol (keys %{$symtab}) { next if $symbol =~ /\A[^:]+::\z/; delete $symtab->{$symbol}; } delete $INC{$_[0]} if $_[0]; # in theory not nec. but tidier and allows us to require the same lib again? return 1; } __END__ #test1.lib file use strict; package FP; sub subtest1{ return 'FP Test 1'; } sub subtest3{ return 'FP Test 3'; } 1; #test2.lib file use strict; package FP; sub subtest1{ return 'FP Test 2'; } 1;