/**
  * Adds a token to one or more states.
  *
  * @param Token $token  - Token.
  * @param array $states - Array of states.
  *
  * @throws ValidationException
  *
  * @return Flow
  */
 public function addTokenToStates(Token $token, array $states) : self
 {
     foreach ($states as $state) {
         if (!$state instanceof State) {
             throw ValidationException::create('Each element of $states must be an instance of State.');
         }
         $state->addToken($token);
     }
     return $this;
 }
 /**
  * Creates a node instance.
  *
  * @param array $data    - Node Data.
  * @param array $options - Node Options.
  *
  * @throws ValidationException
  *
  * @return AbstractNode
  */
 public function createNodeInstance(array $data, array $options = []) : AbstractNode
 {
     if (!isset($data['type'])) {
         throw ValidationException::create('Field "type" is mandatory.');
     }
     switch ($data['type']) {
         case Flow::TYPE:
             $node = new Flow($data, $options);
             break;
         case State::TYPE:
             $node = new State($data, $options);
             break;
         case Transition::TYPE:
             $node = new Transition($data, $options);
             break;
         default:
             throw ValidationException::create('Type "' . $data['type'] . '" invalid.');
     }
     return $node;
 }