Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

Passing parameters to object method references

by graq (Curate)
on Jun 21, 2007 at 10:29 UTC ( #622528=perlquestion: print w/ replies, xml ) Need Help??
graq has asked for the wisdom of the Perl Monks concerning the following question:

I have an object with a method that returns references to other methods on that object. I need to call those methods with parameters.

foo.pl
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Foo; my $help = 'Please display this message'; my $foo = Foo->new; my $subref = $foo->subref; foreach my $pos (@{$subref->{order}}){ print "POS: $pos\n"; my $sub = $subref->{dispatch}->{$pos}; print Dumper($sub); &$sub($help); }
Foo.pm
package Foo; use strict; use warnings; sub new { bless {}, shift; } sub suba { my $self = shift; my $param = shift || ''; print "Message is: $param\n"; } sub subb { return; } sub subref { my $self = shift; return { order => ['A', 'B'], dispatch => { A => sub { $self->suba }, B => sub { $self->subb }, } }; } 1;
> perl foo.pl
POS: A $VAR1 = sub { "DUMMY" }; Message is: POS: B $VAR1 = sub { "DUMMY" };

-=( Graq )=-

Comment on Passing parameters to object method references
Select or Download Code
Re: Passing parameters to object method references
by borisz (Canon) on Jun 21, 2007 at 10:44 UTC
    pass the parameter's to your dispatch
    sub subref { my $self = shift; return { order => ['A', 'B'], dispatch => { A => sub { $self->suba(@_) }, B => sub { $self->subb }, } }; }
    Boris
Re: Passing parameters to object method references
by rhesa (Vicar) on Jun 21, 2007 at 10:47 UTC
    Your subs in the dispatch table need to accept parameters:
    dispatch => { A => sub { $self->suba(@_) }, B => sub { $self->subb(@_) }, }
Re: Passing parameters to object method references
by citromatik (Curate) on Jun 21, 2007 at 11:27 UTC

    Two comments:

    Data::Dumper may not be the best way to Dump closures, I find Data::Dump::Streamer a lot more useful:

    foo.pl

    #!/usr/bin/perl use strict; use warnings; use Data::Dump::Streamer; ##!! use Foo; my $help = 'Please display this message'; my $foo = Foo->new; my $subref = $foo->subref; foreach my $pos (@{$subref->{order}}){ my $sub = $subref->{dispatch}->{$pos}; Dump ($sub); ###!! }

    Outputs:

    my ($self); $self = bless( {}, 'Foo' ); $CODE1 = sub { package Foo; use warnings; use strict 'refs'; $self->suba; }; my ($self); $self = bless( {}, 'Foo' ); $CODE1 = sub { package Foo; use warnings; use strict 'refs'; $self->subb; };

    This seems clearer to me than the output you got from Data::Dumper. And maybe you would catch the error that rhesa points out.

    And since you already broke the encapsulation of your object, why don't you return the plain function instead of a method?:

    package Foo; use strict; use warnings; sub new { bless {}, shift; } sub suba { # my $self = shift; my $param = shift || ''; print "Message is: $param\n"; } sub subb { return; } sub subref { my $self = shift; return { order => ['A', 'B'], dispatch => { A => \&suba, ##! B => \&subb, ##! } }; } 1;

    Outputs (as expected)

    POS: A $CODE1 = sub { package Foo; use warnings; use strict 'refs'; my $param = shift @_ || ''; print "Message is: $param\n"; }; Message is: Please display this message POS: B $CODE1 = sub { package Foo; use warnings; use strict 'refs'; return; };

    citromatik

      Using Data::Dumper is just habit. Maybe I should re-evaluate some of my habits.

      And since you already broke the encapsulation of your object, why don't you return the plain function instead of a method?

      I need the methods to have all the inherited properties of the object they live in (multiple inheritance, including Class::Accessor in the base class). Can I get that from a plain function?

      -=( Graq )=-

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (8)
As of 2014-08-28 09:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (259 votes), past polls