blob: 365661e03a17e3248a664146ed4c92cdc0815d91 [file] [log] [blame]
#Extra stuff
our $DEFAULT_UNLOAD_METHOD ||= "unload_package_pp";
sub unload_package {
goto &$DEFAULT_UNLOAD_METHOD;
}
sub unload_package_pp {
my $package = shift;
no strict 'refs';
my $tab = \%{ $package . '::' };
# below we assign to a symbol first before undef'ing it, to avoid
# nuking aliases. If we undef directly we may undef not only the
# alias but the original function as well
for (keys %$tab) {
#Skip sub stashes
next if /::$/;
my $fullname = join '::', $package, $_;
# code/hash/array/scalar might be imported make sure the gv
# does not point elsewhere before undefing each
if (%$fullname) {
*{$fullname} = {};
undef %$fullname;
}
if (@$fullname) {
*{$fullname} = [];
undef @$fullname;
}
if ($$fullname) {
my $tmp; # argh, no such thing as an anonymous scalar
*{$fullname} = \$tmp;
undef $$fullname;
}
if (defined &$fullname) {
no warnings;
local $^W = 0;
if (defined(my $p = prototype $fullname)) {
*{$fullname} = eval "sub ($p) {}";
}
else {
*{$fullname} = sub {};
}
undef &$fullname;
}
if (*{$fullname}{IO}) {
local $@;
eval {
if (fileno $fullname) {
close $fullname;
}
};
}
}
#Wipe from %INC
$package =~ s[::][/]g;
$package .= '.pm';
delete $INC{$package};
}