/** * Fires an Event. * * The Event gets created, passed around and then returned to the issuer. * * @param mixed $input Object for direct event, string for system event or notifierEvent * @todo Implement Application Events * @todo Implement Directory input for Events from other locations (like Modules) * * @return \FuzeWorks\Event The Event */ public static function fireEvent($input) { if (is_string($input)) { // If the input is a string $eventClass = $input; $eventName = $input; if (!class_exists($eventClass)) { // Check if the file even exists $file = Core::$coreDir . DS . 'Events' . DS . 'event.' . $eventName . '.php'; if (file_exists($file)) { // Load the file $eventClass = "\\FuzeWorks\\Event\\" . $eventClass; include_once $file; } else { // No event arguments? Looks like a notify-event if (func_num_args() == 1) { // Load notify-event-class $eventClass = '\\FuzeWorks\\Event\\NotifierEvent'; } else { // No notify-event: we tried all we could throw new EventException('Event ' . $eventName . ' could not be found!'); } } } $event = new $eventClass($this); } elseif (is_object($input)) { $eventName = get_class($input); $eventName = explode('\\', $eventName); $eventName = end($eventName); $event = $input; } else { // INVALID EVENT return false; } if (self::$enabled) { Logger::newLevel("Firing Event: '" . $eventName . "'"); Logger::log('Initializing Event'); } if (func_num_args() > 1) { call_user_func_array(array($event, 'init'), array_slice(func_get_args(), 1)); } // Do not run if the event system is disabled if (!self::$enabled) { return $event; } Logger::log('Checking for Listeners'); // Read the event register for listeners $register = self::$register; if (isset($register[$eventName])) { for ($i = 0; $i < count($register[$eventName]); ++$i) { Modules::get($register[$eventName][$i]); } } //There are listeners for this event if (isset(self::$listeners[$eventName])) { //Loop from the highest priority to the lowest for ($priority = EventPriority::getHighestPriority(); $priority <= EventPriority::getLowestPriority(); ++$priority) { //Check for listeners in this priority if (isset(self::$listeners[$eventName][$priority])) { $listeners = self::$listeners[$eventName][$priority]; Logger::newLevel('Found listeners with priority ' . EventPriority::getPriority($priority)); //Fire the event to each listener foreach ($listeners as $callback) { if (is_callable($callback)) { Logger::newLevel('Firing function'); } elseif (!is_string($callback[0])) { Logger::newLevel('Firing ' . get_class($callback[0]) . '->' . $callback[1]); } else { Logger::newLevel('Firing ' . implode('->', $callback)); } try { call_user_func($callback, $event); } catch (ModuleException $e) { Logger::exceptionHandler($e); } Logger::stopLevel(); } Logger::stopLevel(); } } } Logger::stopLevel(); return $event; }