code: def set_state(self, newState, timer=0):
          
          if _debug: SSM._debug("set_state %r (%s) timer=%r", newState, SSM.transactionLabels[newState], timer)
  
          # make sure we have a correct transition
          if (self.state == COMPLETED) or (self.state == ABORTED):
              e = RuntimeError("invalid state transition from %s to %s" % (SSM.transactionLabels[self.state], SSM.transactionLabels[newState]))
              SSM._exception(e)
              raise e
  
          # stop any current timer
          self.stop_timer()
  
          # make the change
          self.state = newState
  
          # if another timer should be started, start it
          if timer:
              self.start_timer(timer)
docs: This function is called when the derived class wants to change state.