in reply to Re: Calling an intermediate method
in thread Calling an intermediate method

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}";

Replies are listed 'Best First'.
Re^3: Calling an intermediate method
by tobyink (Canon) on Dec 19, 2013 at 10:59 UTC

    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