/** * Publish an event by calling all listeners that have registered to receive it. * * @param string|KEventInterface $event The event name or a KEventInterface object * @param array|Traversable $attributes An associative array or a Traversable object * @param KObjectInterface $target The event target * @return null|KEventInterface Returns the event object. If the chain is not enabled will return NULL. */ public function publishEvent($event, $attributes = array(), $target = null) { if ($this->isEnabled()) { //Make sure we have an event object if (!$event instanceof KEventInterface) { $event = new KEvent($event, $attributes, $target); } //Notify the listeners $listeners = $this->getListeners($event->getName()); foreach ($listeners as $listener) { $start = microtime(true); call_user_func($listener, $event, $this); $this->__profiles[] = array('message' => $event->getName(), 'period' => microtime(true) - $start, 'time' => microtime(true), 'memory' => $this->getMemoryUsage(), 'target' => $target instanceof KObjectInterface ? $target->getIdentifier() : $target, 'listener' => $listener); if (!$event->canPropagate()) { break; } } return $event; } else { $this->getDelegate()->publishEvent($event, $attributes, $target); } return null; }