in reply to Re^2: goto &method and skipping call frame
in thread goto &method and skipping call frame

One place where I've seen this technique is a ORM package on CPAN - Class::Tables - which auto-generates classes from table names and makes colum names into their methods using AUTOLOAD:

sub AUTOLOAD { my $self = shift; (my $func = $Class::Tables::AUTOLOAD) =~ s/.*:://; croak qq{Can't locate object method "$func" via package "$self"} unless ref $self and UNIVERSAL::isa( $self, "Class::Tables" ); unshift @_, $self, $func; goto &field; }

The field() sub translates its arguments to the appropriate SQL call against the database. I've used that package very much, and I have seen no adverse side effects. And no, I'm not aware of a cleaner way to do this.

I'm still puzzled by the meaning of "AUTOLOAD is localized to a blocks context" part of your question. Does that mean having different lookup-results (depending on scope) for the last-resort AUTOLOAD sub?

Sorry if I'm just being too dumb or having the wrong kind of humour. ;)

perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'

Replies are listed 'Best First'.
Re^4: goto &method and skipping call frame
by LanX (Saint) on Mar 05, 2021 at 19:08 UTC
    Thanks the example from Class::Tables is interesting. :)

    And I now understand goto &$method_ref seems to follow the @ISA chain.

    It doesn't, this was my brain fart. =)

    It's the ->can() which already returned the correct code_ref after following the inheritance chain

    And that's highlighting the difference to Class::Table, $func is a string not a ref.

    Additionally goto &field is not a dynamic call, it will always call the same sub field in the same package.

    Though ->field could be called as a method form other points, since it expects $self as first argument.

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery