sub outer { %trans = _get_transition_table(); my $f = $trans{'start'}; my $result = 0; do { $result = $f1->(); my $state = ($result) ? "$f.true" : "$f.false"; $f = $trans{ $state }; } while ($f); return ($result); } sub _get_transition_table { my $f1 = \&f1; my $f2 = \&f2; my $f3 = \&f3; [...] return ( "start" => $f1, "$f1.true" => 0, "$f1.false" => $f2, [...] ); }