sub foo { my $foo = shift; return undef unless defined $foo; no warnings 'redefine'; *foo = sub { $foo }; foo(); } { my $bar; sub bar { defined $bar ? $bar : ($bar = shift); } }