The long-time standard module Symbol to the rescue. Just change undef %Foo::; to delete_package('Foo');.
#! /usr/bin/perl -w
use strict;
use Symbol 'delete_package';
my $s;
print "Creating functions\n";
my $x = TellDestroy->new(sub {print $s}, "variable sub");
*Foo::function = TellDestroy->new(sub {print $s}, "glob sub");
print "Clearing variable\n";
undef $x;
print "Clearing glob\n";
delete_package('Foo');
print "Exiting\n";
package TellDestroy;
use Scalar::Util qw(refaddr);
my %function_name;
sub new {
my ($class, $self, $name) = @_;
$function_name{refaddr($self)} = $name;
bless $self, $class;
}
sub DESTROY {
my $self = shift;
my $name = delete $function_name{ refaddr($self) };
print STDERR "$name is going away\n";
}
__END__
Name "Foo::function" used only once: possible typo at ...
Creating functions
Clearing variable
variable sub is going away
Clearing glob
glob sub is going away
Exiting
lodin