eventList[] = $event; } public function eventFromType(string $type) : array { return array_filter($this->eventList, fn($ev) => $ev instanceof $type); } public function pushEvent(Event $event) : void { $this->eventList[] = $event; } public function eventFromName(string $name) : array { return array_filter($this->eventList, fn($ev) => property_exists($ev, 'name') && $ev->name === $name); } public function execute(string $name, &...$arguments) : void { $continue = true; foreach($this->eventFromName($name) as $event) { if ($continue) { $event->execute($this->container, ...$arguments); $continue = empty($event->stopPropagation); } } foreach($this->eventfromType($name) as $event) { if ($continue) { call_user_func_array([ $event, 'execute'], $arguments); $continue = empty($event->stopPropagation); } } } }