I just wrote a wrappers module that will allow arbitrary wrapping of any (named) subroutine. It manipulates the symbol table to do so. The re-definition of subroutines is happening fine. The only problem I'm having is deleting them in the presence of inheritance. Here's a simple test program that shows what's happening:
#!/usr/bin/perl -w
use strict;
package A;
sub A { print "A::A $_[0]\n" }
package B;
@B::ISA = 'A';
$B::A = "i'm \$B::A\n\n";
package main;
A->A;
B->A; # calls A::A
print $B::A;
*{B::A} = sub { print "B::A $_[0]\n" }; # works fine
A->A;
B->A; # now calls B::A
print $B::A;
undef &{B::A};
A->A;
# Why doesn't it just call A::A here because of inheritance?
B->A; # Not a CODE reference at noinherit.pl line 27.
print $B::A;
Now, I'm certain that I'm just missing something elementary, but could someone point me in the right direction? I only want to delete my definition of &B::A so it'll go back to inheriting from &A::A. And I don't want to clobber $B::A in the process.