use Data::Swap; sub myhandler : ATTR(CODE) { my ($p, $s, $r, ...) = @_; swap $r, \my $o; swap $r, sub { # code &$o; }; }