Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re: Perl OO: Need a concise way of representing operations on an object

by rjt (Deacon)
on Nov 04, 2012 at 10:25 UTC ( #1002182=note: print w/ replies, xml ) Need Help??


in reply to Perl OO: Need a concise way of representing operations on an object

The trick here is to return a closure from a generator function. Below is a complete working example. However the salient bit is returning refs to $cont and $foo from the generator function, and dereferencing them in the caller to initialize or change them.

package Foobar; sub _setup_xforms { my ($cont, $foo); return (\$cont, \$foo, { xform1 => sub { printf("Level %d,foo=%s\n", $cont, $foo); +}, }); }; sub transform { my ($self, $cont) = @_; my ($cont_ref, $foo_ref, $xforms) = _setup_xforms(); $$cont_ref //= $cont; # //= to convince you it's not still set for my $xform (values %$xforms) { $$foo_ref //= 0; # //= as above $xform->(); $$foo_ref++; $self->transform($cont + 1) if ($cont < 5); print "Level $cont done, foo=$$foo_ref\n"; } } sub new { bless({},'Foobar') } my $foo = new Foobar( id => 1 ); $foo->transform(0);

This produces the following output:

Level 0,foo=0 Level 1,foo=0 Level 2,foo=0 Level 3,foo=0 Level 4,foo=0 Level 5,foo=0 Level 5 done, foo=1 Level 4 done, foo=1 Level 3 done, foo=1 Level 2 done, foo=1 Level 1 done, foo=1 Level 0 done, foo=1


Comment on Re: Perl OO: Need a concise way of representing operations on an object
Select or Download Code
Replies are listed 'Best First'.
Re^2: Perl OO: Need a concise way of representing operations on an object
by wanna_code_perl (Pilgrim) on Nov 05, 2012 at 00:45 UTC

    This is exactly the solution I was looking for. It looks like it'll be easy to extend.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (14)
As of 2015-07-29 18:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (267 votes), past polls