Emulated implicit method invocation

作者:   發佈於:  

I just realized how easy it is, in Perl 5, to emulate a implicit method invocation given a '$self' is around:

sub foo {
    my ($self) = @_;

    # make this the same as $self->bar(1, 2, 3)
    bar(1, 2, 3);
}

use PadWalker qw(peek_my);

sub bar {
    # get '$self' from caller scope.
    if (ref($_[0]) ne __PACKAGE__) {
        my $caller_self = peek_my(1)->{'$self'};
        unshift @_, $$caller_self;
    }

    my ($self) = @_;

    ...;
}

Apparently it'll be nice to have it in Rubyish, and/or self.pm