Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re: Calling an intermediate method

by tobyink (Canon)
on Dec 18, 2013 at 23:45 UTC ( [id://1067742]=note: print w/replies, xml ) Need Help??


in reply to Calling an intermediate method

Not quite sure what you mean. Maybe like this?

package Foo { sub new { bless [] }; sub msg { my $self = shift; printf "On my way to '%s'\n", @_; } sub Berlin { my $self = shift; $self->msg('Berlin'); print "I'm in Berlin!\n"; } sub Paris { my $self = shift; $self->msg('Paris'); print "I'm in Paris!\n"; } }; my $obj = Foo->new; $obj->Berlin();

Or maybe you mean like this?

package Foo { sub new { bless [] }; sub msg { my $self = shift; printf "On my way to '%s'\n", @_; } sub Berlin { my $self = shift; print "I'm in Berlin!\n"; } sub Paris { my $self = shift; print "I'm in Paris!\n"; } }; use Class::Method::Modifiers qw( install_modifier ); for my $city (qw/ Paris Berlin /) { install_modifier "Foo", before => $city => sub { my $self = shift; $self->msg($city); }; } my $obj = Foo->new; $obj->Berlin();
use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name

Replies are listed 'Best First'.
Re^2: Calling an intermediate method
by trizen (Hermit) on Dec 19, 2013 at 00:20 UTC

    Thank you very much. Class::Method::Modifiers does exactly what I want, but the bad thing is that you must know all the method names. I worked around this issue by using the special hash %PackageName::, but I really don't like this ugly fix. I looked briefly in the documentation of overload, but there doesn't seem to be any way to overload the method caller. Maybe, will come some day...

    use 5.014; package Foo { sub new { bless [] } use Class::Method::Modifiers qw(before); foreach my $method (keys %Foo::) { next if $method =~ /^(_|(?:BEGIN|new|before)\z)/; before $method => sub { my ($self) = @_; print "** Preparing...\n"; push @{$self}, 'money'; print "** Ready to continue...\n"; }; } sub Berlin { my $self = shift; print "> I'm in Berlin!\n"; } sub Paris { my $self = shift; print "> I'm in Paris!\n"; } }; my $obj = Foo->new; $obj->Berlin(); say "# Self contains: @{$obj}";

      Sub attributes provide a fairly nice alternative...

      use 5.014; package Foo { sub new { bless [] } use Attribute::Handlers; use Class::Method::Modifiers qw(before); sub City :ATTR { my $method = substr *{$_[1]}, 1; before $method => sub { my ($self) = @_; print "** Preparing...\n"; push @{$self}, 'money'; print "** Ready to continue...\n"; }; } sub Berlin :City { my $self = shift; print "> I'm in Berlin!\n"; } sub Paris :City { my $self = shift; print "> I'm in Paris!\n"; } }; my $obj = Foo->new; $obj->Berlin(); say "# Self contains: @{$obj}";
      use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (3)
As of 2024-04-25 14:46 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found