in reply to can undefined methods?

When you make undef &fred you are just declaring that sub fred {} is undefined when is called, but this won't remove the CODE reference from the GLOB *fred. Is like to say that *fred{CODE} can't be executed. This behavior exists because you still can have compiled code that make references to this CODE.

If you really want to remove the CODE from the memory you should use undef *fred, and you will see that can() wont return the CODE.

But note that undef *fred will remove from memory all fred symbols, like @fred, $fred, etc... So, you should make something like that to remove the code:

sub fred { print "FRED>> @_\n" ; } @fred = qw(a b c) ; fred() ; print "ARRAY: @fred\n" ; my $can = __PACKAGE__->can('fred') ; print "can1: $can\n" ; undef_sub('fred') ; my $can = __PACKAGE__->can('fred') ; print "can2: $can\n" ; print "ARRAY: @fred\n" ; sub undef_sub { my $sub = shift ; my $s = *{$sub}{SCALAR} ; my $a = *{$sub}{ARRAY} ; my $h = *{$sub}{HASH} ; undef *{$sub} ; *{$sub} = $s ; *{$sub} = $a ; *{$sub} = $h ; }

By gmpassos