in reply to Re: Overloading without infinite descent
in thread Overloading without infinite descent (fixed by time: see Perl 5.10.1)

This gives the advertised output, and certainly avoids the infinite descent, but it seems only to do what I want for the empty sub (or any other side-effect-free sub, I suppose)—if I execute ( bless sub { print "I am a side effect\n" } => 'Before' )->(), then I am a side effect is never printed.

Replies are listed 'Best First'.
Re^3: Overloading without infinite descent
by Anonymous Monk on Aug 03, 2009 at 07:10 UTC
    Probably because that sub is never executed
      Right, but my hope was that it would be—that is, that, upon de-referencing, the ‘pre-code’ would be executed first, then the code to which the reference actually points. Thus, I'd like to see:
      ( bless sub { print "I am a side effect\n" } => 'Before' )->()
      print
      Stuff before I am a side effect
        BEGIN { package Before; my (%looper); use overload '&{}' => sub { my ($f) = @_; print "Stuff before \n"; return $looper{ overload::StrVal($f) }; }; sub new { my ( $package, $sub ) = @_; my $self = bless sub { }, $package; my $fs = overload::StrVal($self); $looper{$fs} = $sub; use Scalar::Util(); Scalar::Util::weaken( $looper{$fs} ); return $self; } } package main; { my $fx = sub { print "I am a side effect\n" }; my $now = Before->new($fx); $now->(); warn "fx => $fx "; warn "now => ", overload::StrVal $now ; bless $fx, 'Before'; warn "fx => ", overload::StrVal $fx; $fx->(); } __END__ Stuff before I am a side effect fx => CODE(0x18513ac) at - line 27. now => Before=CODE(0x18304d0) at - line 28. fx => Before=CODE(0x18513ac) at - line 30. Stuff before Overloaded dereference did not return a reference at - line 31.