self::$defaultPriority, 'passParams' => false); $this->_listeners[$eventKey][$options['priority']][] = array( 'callable' => $callable, 'passParams' => $options['passParams'], ); } /** * Removes a listener from the active listeners. * * @param callback|CakeListener $callable any valid PHP callback type or an instance of CakeListener * @return void */ public function detach($callable, $eventKey = null) { if (empty($eventKey)) { foreach (array_keys($this->_listeners) as $eventKey) { $this->detach($callable, $eventKey); } return; } if (empty($this->_listeners[$eventKey])) { return; } foreach ($this->_listeners[$eventKey] as $priority => $callables) { foreach ($callables as $k => $callback) { if ($callback['callable'] === $callable) { unset($this->_listeners[$eventKey][$priority][$k]); break; } } } } /** * Dispatches a new event to all configured listeners * * @param mixed $event the event key name or instance of CakeEvent * @return void */ public function dispatch($event) { if (is_string($event)) { $Event = new CakeEvent($event); } if (empty($this->_listeners[$event->name()])) { return; } foreach ($this->listeners($event->name()) as $listener) { if ($event->isStopped()) { break; } if ($listener['passParams'] === true) { call_user_func_array($listener['callable'], $event->data); } else { call_user_func($listener['callable'], $event); } continue; } } /** * Returns a list of all listeners for a eventKey in the order they should be called * * @param string $eventKey * @return array */ public function listeners($eventKey) { if (empty($this->_listeners[$eventKey])) { return array(); } ksort($this->_listeners[$eventKey]); return array_reduce($this->_listeners[$eventKey], 'array_merge', array()); } }