*/ class REvent { private static $_events = array(); private static $_listeners = array(); /** * Dispatch event * * @param string $event Event name * @param array $params */ public static function dispatch($event, array $params = array()) { if (empty(self::$_listeners[$event])) { return; } if (isset(self::$_events[$event]["enabled"]) && !self::$_events[$event]["enabled"]) { return; } foreach (rock_array_sort(self::$_listeners[$event], "priority") as $index => $listener) { call_user_func_array($listener["callback"], array($params)); if (isset(self::$_events[$event]["enabled"]) && !self::$_events[$event]["enabled"]) { return; } } } /** * Add a event listener * * @param string $event Event name * @param callback|string $callback Event listener * @param integer $priority Listener priority */ public static function listen($event, $callback, $priority = -1) { if ($priority == -1) { if (isset(self::$_listeners[$event])) { $priority = count(self::$_listeners[$event]); } } self::$_listeners[$event][] = array( "callback" => $callback, "priority" => $priority ); } /** * Stop event propagation * * @param string $event Event name */ public static function stop($event) { self::$_events[$event]["enabled"] = false; } /** * Remove a event listener * * @param string $event Event name * @param callback|string $callback Event listener */ public static function remove($event, $callback) { if (empty(self::$_listeners[$event])) { return; } foreach (self::$_listeners[$event] as $index => $listener) { if ($listener["callback"] == $callback) { unset(self::$_listeners[$event][$index]); } } } } ?>