sub initial_state { ... return \&some_state; } sub some_state { ... if ( ... ) { return \&some_state; } else { return \&final_state; } } sub final_state { ... return undef; } my $state = \&initial_state; while ( $state ) { $state = $state->(); }