=== API Examples ===

{{{#!python
sm = StateMachine(['aborted','preempted'])
sm2 = StateMachine(['done'])
sm3 = StateMachine(['done'])
sm4 = StateMachine(['done'])
sm5 = StateMachine(['done'])

sm5.add('T6',SPAState(),
  { 'succeeded':'SETTER',
    'aborted':'T6',
    'preempted':'SETTER'})
sm5.add('SETTER',Setter(),
  { 'done':'done'})

con_split = ConcurrentSplit(default_outcome = 'succeeded')
con_split.add('SETTER', Setter())
con_split.add('RADICAL',sm5)
con_split.add('GETTER', Getter())

con_split.add_outcome_map(({'SETTER':'done'},'succeeded'))

with sm.sequence('done'):
  sm.add('GETTER1', Getter())

  sm.add('S2',sm2)
  sm2.add('SETTER', Setter(), {'done':'A_SPLIT'})
  sm2.add('A_SPLIT', con_split, {'succeeded':'done'})

  sm.add('S3',sm3,{'done':'TRINARY!'})
  sm3.add('SETTER', Setter(), {'done':'RADICAL'})
  sm3.add('RADICAL', sm4, {'done':'SETTER2'})

  sm4.add('T5',SPAState(),
      { 'succeeded':'SETTER',
        'aborted':'T5',
        'preempted':'SETTER'})
  sm4.add('SETTER',Setter(),{'done':'done'})

  sm3.add('SETTER2', Setter(), {'done':'done'})

sm.add('TRINARY!',SPAState(),
    {'succeeded':'T2','aborted':'T3','preempted':'T4'})

with sm.sequence('succeeded'):
  sm.add('T2',SPAState(),{})
  sm.add('T3',SPAState(),{'aborted':'S2'})
  sm.add('T4',SPAState(),{'succeeded':'GETTER2','aborted':'TRINARY!'})

sm.add(('GETTER2', Getter(), {'done':'GETTER1'}))

# Set default initial states
sm.set_initial_state(['GETTER1'],smach.UserData())
sm2.set_initial_state(['SETTER'],smach.UserData())
sm3.set_initial_state(['SETTER'],smach.UserData())
sm4.set_initial_state(['T5'],smach.UserData())
sm5.set_initial_state(['T6'],smach.UserData())
}}}

===== Lexical shadowing of currently "open" smach container =====
{{{#!python

sc = StateMachine(['aborted','preempted'])
sc.set_initial_state(['GETTER1'],scach.UserData())

with sc.connect_outcomes('done') as sc:
  sc.add('GETTER1', Getter())
  
  with sc.add('S2',StateMachine(['done'])) as sc:
    sc.set_initial_state(['SETTER'])
    sc.add('SETTER', Setter(), {'done':'A_SPLIT'})

    with sc.add('A_SPLIT',ConcurrentSplit(default_outcome = 'succeeded'), {'succeeded':'done'}) as sc:
      sc.add_outcome_map(({'SETTER':'done'},'succeeded'))

      sc.add('SETTER',Setter())
      sc.add('GETTER',Getter())
      
      with sc.add('RADICAL',StateMachine(['done'])) as sc:
        sc.add('T6', SPAState(),
          { 'succeeded':'SETTER',
            'aborted':'T6',
            'preempted':'SETTER'})
        sc.add('SETTER',Setter(), { 'done':'done'})
  
  with sc.add('S3',StateMachine(['done']),{'done':'TRINARY!'}) as sc:
    sc.add('SETTER', Setter(), {'done':'RADICAL'})
    sc.set_initial_state(['SETTER'])

    with sc.add('RADICAL',StateMachine(['done']),{'done':'SETTER2'}) as sc:
      sc.set_initial_state(['T5'])
      sc.add('T5',SPAState(),
          { 'succeeded':'SETTER',
            'aborted':'T5',
            'preempted':'SETTER'})
      sc.add('SETTER',Setter(),{'done':'done'})

    sc.add('SETTER2', Setter(), {'done':'done'})

sc.add('TRINARY!',SPAState(),
    {'succeeded':'T2','aborted':'T3','preempted':'T4'})

with sc.connect_outcomes('succeeded') as sc:
  sc.add('T2',SPAState(),{})
  sc.add('T3',SPAState(),{'aborted':'S2'})
  sc.add('T4',SPAState(),{'succeeded':'GETTER2','aborted':'TRINARY!'})
}}}

===== Method redirection using modification of smach namespace behavior =====

{{{#!python

sc_root = StateMachine(['aborted','preempted'])
smach.set_initial_state(['GETTER1'],smach.UserData())

with smach.connect_outcomes('done'):
  smach.add('GETTER1', Getter())
  
  with smach.add('S2',StateMachine(['done'])):
    smach.set_initial_state(['SETTER'])
    smach.add('SETTER', Setter(), {'done':'A_SPLIT'})

    with smach.add('A_SPLIT',ConcurrentSplit(default_outcome = 'succeeded'), {'succeeded':'done'}):
      smach.add_outcome_map(({'SETTER':'done'},'succeeded'))

      smach.add('SETTER',Setter())
      smach.add('GETTER',Getter())
      
      with smach.add('RADICAL',StateMachine(['done'])):
        smach.add('T6', SPAState(),
          { 'succeeded':'SETTER',
            'aborted':'T6',
            'preempted':'SETTER'})
        smach.add('SETTER',Setter(), { 'done':'done'})
  
  with smach.add('S3',StateMachine(['done']),{'done':'TRINARY!'}):
    smach.add('SETTER', Setter(), {'done':'RADICAL'})
    smach.set_initial_state(['SETTER'])

    with smach.add('RADICAL',StateMachine(['done']),{'done':'SETTER2'}):
      smach.set_initial_state(['T5'])
      smach.add('T5',SPAState(),
          { 'succeeded':'SETTER',
            'aborted':'T5',
            'preempted':'SETTER'})
      smach.add('SETTER',Setter(),{'done':'done'})

    smach.add('SETTER2', Setter(), {'done':'done'})

smach.add('TRINARY!',SPAState(),{'succeeded':'T2','aborted':'T3','preempted':'T4'})

with smach.connect_outcomes('succeeded'):
  smach.add('T2',SPAState(),{})
  smach.add('T3',SPAState(),{'aborted':'S2'})
  smach.add('T4',SPAState(),{'succeeded':'GETTER2','aborted':'TRINARY!'})
}}}