/** * Emits the events corresponding to applying the provided input on the provided object. * * @param Input $input * @param Stateful $object * @param Context $context * @param State $nextState * * @return void * * @throws StateTransitionFailed */ private function emitEvents(Input $input, Stateful $object, Context $context, State $nextState) { /** @var Event $event */ foreach ($this->eventProvider($input, $object->getCurrentState()) as $event) { if (!$this->emitter->hasListeners($event->getName())) { continue; } if ($this->emitter->emit($event, $object, $context, $input, $nextState)->isPropagationStopped()) { $this->emitter->emit(Event::named('failed'), $object, $context, $input, $nextState); throw new StateTransitionFailed($input, $object, $context, $nextState); } } }