events)) { trigger_error("Event '{$event_name}' does not exists!", E_USER_WARNING); return false; } // Check method is callable if (! is_callable(array($plugin, $listener))) { trigger_error("Method '{$listener}' is not callable!", E_USER_WARNING); return false; } // Check priority if (is_null($priority)) { $priority = $plugin->getWeight(); } // Attach listener $this->events[$event_name][$priority . "_" . $this->offset] = array( 'plugin' => $plugin, 'listener' => $listener ); $this->offset++; return true; } /** * Detach listener function from event * * @param string $event_name Event's name * @param Plugin $plugin Plugin object, that handles the event * @param string $listener Plugins method, that handles the event * @return boolean true on success or false on failure. */ public function detachListener($event_name, Plugin $plugin, $listener){ // Check event exists if (! array_key_exists($event_name, $this->events)) { trigger_error("Event '{$event_name}' does not exists!", E_USER_WARNING); return false; } // Search event and $plugin->$listener foreach ($this->events[$event_name] as $index => $event) { if ($event['plugin'] === $plugin && $event['listener'] == $listener) { // Detach listener unset($this->events[$event_name][$index]); return true; } } return false; } /** * Registers new event * * @param string $event_name Event's name * @return boolean true on success or false on failure */ public function registerEvent($event_name){ // Check event exists if (array_key_exists($event_name, $this->events)) { trigger_error("Event '{$event_name}' already exists!", E_USER_WARNING); return false; } // register event $this->events[$event_name] = array(); return true; } /** * Triggers the event * * @param string $event_name Event's name * @param array &$arguments Arguments passed to listener * @return boolean true on success or false on failure */ public function triggerEvent($event_name, &$arguments = array()){ // Check event exists if (! array_key_exists($event_name, $this->events)) { trigger_error("Event '{$event_name}' does not exists!", E_USER_WARNING); return false; } // Sorting listeners by priority uksort($this->events[$event_name], 'strnatcmp'); // Invoke listeners foreach ($this->events[$event_name] as $event) { $plugin = $event['plugin']; $listener = $event['listener']; $plugin->$listener($arguments); } } } ?>