Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Passing parameters to object method references

by graq (Curate)
on Jun 21, 2007 at 10:29 UTC ( [id://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 )=-

Replies are listed 'Best First'.
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
Domain Nodelet?
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?Last hourOther CB clients
Other Users?
Others learning in the Monastery: (2)
As of 2024-04-26 05:07 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found