<?php

// Проверка
if (! defined('BASE_DIR'))
	exit('Access denied');

/**
 * This source file is part of the AVE.cms. More information,
 * documentation and tutorials can be found at http://www.ave-cms.ru
 *
 * @package      AVE.cms
 * @file         system/helpers/hooks.php
 * @author       @
 * @copyright    2007-2016 (c) AVE.cms
 * @link         http://www.ave-cms.ru
 * @version      4.0
 * @since        $date$
 * @license      license GPL v.2 http://www.ave-cms.ru/license.txt
*/

class Hooks
{
	public static $instance;

	public static $hooks;

	public static $current_hook;

	public static $run_hooks;


	public static function init()
	{
		if (!self::$instance) {
			self::$instance = new Hooks();
		}
		return self::$instance;
	}

	/**
	 * Add Hook
	 */
	public static function register($name, $function, $priority = 10)
	{
		// If we have already registered this action return true
		if (isset(self::$hooks[$name][$priority][$function]))
		{
			return true;
		}
		/**
		 * Allows us to iterate through multiple action hooks.
		 */
		if (is_array($name))
		{
			foreach ($name AS $item)
			{
				// Store the action hook in the $hooks array
				self::$hooks[$item][$priority][$function] = array(
					"function" => $function
				);
			}
		}
		else
		{
			// Store the action hook in the $hooks array
			self::$hooks[$name][$priority][$function] = array(
				"function" => $function
			);
		}

		return true;
	}

	/**
	 * Do Hook
	 */
	public static function trigger($name, $arguments = "")
	{
		// Oh, no you didn't. Are you trying to run an action hook that doesn't exist?
		if (! isset(self::$hooks[$name]))
		{
			return $arguments;
		}

		// Set the current running hook to this
		self::$current_hook = $name;

		// Key sort our action hooks
		ksort(self::$hooks[$name]);
		foreach (self::$hooks[$name] AS $priority => $names)
		{
			if (is_array($names))
			{
				foreach ($names AS $name)
				{
					$return = call_user_func_array($name['function'], array(
						&$arguments
					));

					if ($return)
					{
						$arguments = $return;
					}

					self::$run_hooks[$name][$priority];
				}
			}
		}

		self::$current_hook = '';

		return $arguments;
	}

	/**
	 * Remove Hook
	 */
	public static function unregister($name, $function, $priority = 10)
	{
		// If the action hook doesn't, just return true
		if (!isset(self::$hooks[$name][$priority][$function]))
		{
			return true;
		}
		// Remove the action hook from our hooks array
		unset(self::$hooks[$name][$priority][$function]);

		return '';
	}


	/**
	 * Current Hook
	 *
	 * Get the currently running action hook
	 *
	 */
	public static function current()
	{
		return self::$current_hook;
	}


	/**
	 * Has Run
	 */
	public static function has($hook, $priority = 10)
	{
		if (isset(self::$hooks[$hook][$priority]))
		{
			return true;
		}
		else
		{
			return false;
		}
	}


	/**
	 * Hook Exists
	 */
	public static function exists($name)
	{
		if (isset(self::$hooks[$name]))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}