in reply to Re: SUPER or NEXT from imported methods
in thread SUPER or NEXT from imported methods

That function that walks the symbol tree is what NEXT is supposed to be. I don't know why it doesn't like this scenario. What exactly do you mean, use eval to compile it into the package? Something like this?
sub import { my $package = shift; my $methodname = shift; my $dest = caller; eval <<END package $package; sub $methodname { return shift->SUPER::blah(); }; 1; END }
That seems to work. I was hoping my imported symbol could make use of closure variables, but I guess I could just interpolate them into the eval.

Replies are listed 'Best First'.
Re^3: SUPER or NEXT from imported methods
by tilly (Archbishop) on Feb 21, 2009 at 02:04 UTC
    NEXT doesn't like this because it uses caller to find the calling package, and caller sees the package the function was compiled in, not the one that was called.

    You have the right idea with the eval approach, but I was suggesting something more like this:

    sub import { my $package = shift; my $methodname = shift; my $dest = caller; my $compiled_in = __PACKAGE__; # The initial comment improves error messages. eval qq{# line 1 "Loaded by $compiled_in\::import" package $package; sub $methodname { return shift->SUPER::blah(); } }; die $@ if $@; }
    Also note that your imported symbol can make use of closure variables without interpolating them. If you put \$foo in your code, that will be compiled as $foo, and that will pick up any lexical $foo that is in scope when the eval happens.
      Oh, I didn't realize runtime compiled evals would pick up closure variables, but in retrospect, they'd have to for a lot of things to work. Thanks a lot, I'll use this.