sub foo { no warnings 'redefine'; if ($cond1) { *foo = sub { ... }; } elsif ($cond2) { *foo = sub { ... }; } else { *foo = sub { ... }; } goto &foo; }