Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

Re^3: Adding functionality to an Object

by xdg (Monsignor)
on Jul 13, 2006 at 12:46 UTC ( #560930=note: print w/replies, xml ) Need Help??

in reply to Re^2: Adding functionality to an Object
in thread Adding functionality to an Object

I would like to do this stuff on runtime. Is there documentation about this stuff ?

If you are designing the objects, then look at Class::Prototyped.

my $cp = Class::Prototyped->new(); my $mirror = $cp->reflect(); $mirror->addSlots( field1 => 'foo', sub1 => sub { print "this is sub1 printing field1: '".$_[0]->field1."'\n"; }, ); $mirror->deleteSlot('sub1');

There are others, too, like Class::Object or Class::Decorator that do things like this in various ways.

If you didn't design the object, then you could use Class::Adapter to wrap the object while adding your own methods.

As more of a hack, if you really need to do it on the fly, you can rebless the object into a dynamically generated subclass that has the methods you want. E.g.

# Create an object of Some::Class my $obj = Some::Class->new(); $obj->foo(); # where foo() is a method of Some::Class # Create the new "class" by assigning @ISA and a method in the new nam +espace @Some::Class::Extended::ISA = qw/Some::Class/; *Some::Class::Extended::bar = sub { my $self = shift; print "Hello, Ba +r" }; # Rebless the object to the new class bless $obj, 'Some::Class::Extended'; $obj->foo; # From Some::Class $obj->bar; # From Some::Class::Extended


Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://560930]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (3)
As of 2021-04-17 15:17 GMT
Find Nodes?
    Voting Booth?

    No recent polls found