sub fudge_method { my($obj, $method, $sub) = @_; ## you'll probably want to extend this for other data types $_[0] = bless {%$obj}, init_class(ref $obj, $method, $sub); } { my $cnt = 0; sub init_class { my($class,$method,$sub) = @_; my $name = $class."::_tmp".$cnt++; no strict 'refs'; @{$name."::ISA"} = $class; *{$name."::$method"} = $sub; return $name; } } { package foo; sub new { bless {@_[1 .. $#_]}, shift } sub dostuff { print "I'm doing stuff [", %{$_[0]}, "]\n" } } my $o = foo->new(field => 'var'); print "pre fudge - "; $o->dostuff(); fudge_method($o, 'dostuff', sub { print "I've done stuff [", %{$_[0]}, "]\n"; }); print "post fudge - "; $o->dostuff(); my $o2 = foo->new(this => 'that'); print "new object - "; $o2->dostuff(); __output__ pre fudge - I'm doing stuff [fieldvar] post fudge - I've done stuff [fieldvar] new object - I'm doing stuff [thisthat]