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.