package A; use Data::Dumper (); sub Dumper { print "This is not dumper\n"; } #### package ibase; BEGIN { require base; *{"_import"} = \&{"base::import"}; for (qw( )) { *{"$_"} = \&{"base::$_"}; } } our $ExportLevel = 0; sub import { my $self = shift; my $callpkg = caller($ExportLevel); eval { $self->_import(@_); }; for my $key (keys %INC) { if ($key =~ m|Data/Dumper.pm|) { *{"$callpkg\::Dumper"} = \&{"Data::Dumper::Dumper"}; } } } 1; #### package A; use Data::Dumper; print Dumper \%INC, \@INC; package B; use strict; use ibase 'A'; print Data::Dumper::Dumper(\%A::INC, \%INC); print Dumper([1]);