<?php namespace System\Routing;

class Filter {

	/**
	 * The loaded route filters.
	 *
	 * @var array
	 */
	private static $filters = array();

	/**
	 * Register a set of route filters.
	 *
	 * @param  array  $filters
	 * @return void
	 */
	public static function register($filters)
	{
		static::$filters = array_merge(static::$filters, $filters);
	}

	/**
	 * Clear all of the registered route filters.
	 *
	 * @return void
	 */
	public static function clear()
	{
		static::$filters = array();
	}

	/**
	 * Call a set of route filters.
	 *
	 * @param  string  $filter
	 * @param  array   $parameters
	 * @param  bool    $override
	 * @return mixed
	 */
	public static function call($filters, $parameters = array(), $override = false)
	{
		foreach (explode(', ', $filters) as $filter)
		{
			if ( ! isset(static::$filters[$filter])) continue;

			$response = call_user_func_array(static::$filters[$filter], $parameters);

			// "Before" filters may override the request cycle. For example, an authentication
			// filter may redirect a user to a login view if they are not logged in. Because of
			// this, we will return the first filter response if overriding is enabled.
			if ( ! is_null($response) and $override) return $response;
		}
	}

}