How can I change the definition of this method on this object only, at runtime, after the instance's creation?Since calling a method is really just calling a subroutine with a bit of extra magic this isn't easily doable, as if you change the method that a given object calls, it'll be changed for any other objects that access that method. Off the top of my head you could do something like this
That code is rather hackish (only deals with blessed hashes for exampple) but hopefully it'll give you a start on what you want achieved.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]
_________
broquaint
In reply to Re: changing object's methods at runtime
by broquaint
in thread changing object's methods at runtime
by ViceRaid
For: | Use: | ||
& | & | ||
< | < | ||
> | > | ||
[ | [ | ||
] | ] |