docs: def create_transition(self, from_state_id, from_outcome, to_state_id, to_outcome, transition_id):
          """ Creates a new transition.
  
          Lookout: Check the parameters first before creating a new transition
  
          :param from_state_id: The source state of the transition
          :param from_outcome: The outcome of the source state to connect the transition to
          :param to_state_id: The target state of the transition
          :param to_outcome: The target outcome of a container state
          :param transition_id: An optional transition id for the new transition
          :raises exceptions.AttributeError: if the from or to state is incorrect
          :return: the id of the new transition
          """
  
          # get correct states
          if from_state_id is not None:
              if from_state_id == self.state_id:
                  from_state = self
              else:
                  from_state = self.states[from_state_id]
  
          # finally add transition
          if from_outcome is not None:
              if from_outcome in from_state.outcomes:
                  if to_outcome is not None:
                      if to_outcome in self.outcomes:  # if to_state is None then the to_outcome must be an outcome of self
                          self.transitions[transition_id] = \
                              Transition(from_state_id, from_outcome, to_state_id, to_outcome, transition_id, self)
                      else:
                          raise AttributeError("to_state does not have outcome %s", to_outcome)
                  else:  # to outcome is None but to_state is not None, so the transition is valid
                      self.transitions[transition_id] = \
                          Transition(from_state_id, from_outcome, to_state_id, to_outcome, transition_id, self)
              else:
                  raise AttributeError("from_state does not have outcome %s", from_state)
          else:
              self.transitions[transition_id] = \
                  Transition(None, None, to_state_id, to_outcome, transition_id, self)
  
          # notify all states waiting for transition to be connected
          self._transitions_cv.acquire()
          self._transitions_cv.notify_all()
          self._transitions_cv.release()
  
          return transition_id