import collections from functools import partial from pysistence.func import trampoline def setup(): print 'Setting up...' return True def first_step(): print 'First step...' return True def second_step(): print 'Second step...' return True def wait(): print 'Waiting...' return True def stop(): print 'Stopping...' return True State = collections.namedtuple('State', 'name function on_success on_failure') do_start = State(name='start', function=setup, on_success='do_first_step', on_failure='do_stop') do_first_step = State(name='first_step', function=first_step, on_success='do_second_step', on_failure='do_stop') do_second_step = State(name='second_step', function=second_step, on_success='do_wait', on_failure='do_stop') do_wait = State(name='wait', function=wait, on_success='do_first_step', on_failure='do_stop') do_stop = State(name='stop', function=stop, on_success=None, on_failure=None) def state_machine(state): if state.function(): new_state = globals().get(state.on_success, None) else: new_state = globals().get(state.on_failure, None) if new_state: return partial(state_machine, new_state) if __name__ == '__main__': trampoline(state_machine, do_start)