225 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			225 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * SimplePie
 | 
						|
 *
 | 
						|
 * A PHP-Based RSS and Atom Feed Framework.
 | 
						|
 * Takes the hard work out of managing a complete RSS/Atom solution.
 | 
						|
 *
 | 
						|
 * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
 | 
						|
 * All rights reserved.
 | 
						|
 *
 | 
						|
 * Redistribution and use in source and binary forms, with or without modification, are
 | 
						|
 * permitted provided that the following conditions are met:
 | 
						|
 *
 | 
						|
 * 	* Redistributions of source code must retain the above copyright notice, this list of
 | 
						|
 * 	  conditions and the following disclaimer.
 | 
						|
 *
 | 
						|
 * 	* Redistributions in binary form must reproduce the above copyright notice, this list
 | 
						|
 * 	  of conditions and the following disclaimer in the documentation and/or other materials
 | 
						|
 * 	  provided with the distribution.
 | 
						|
 *
 | 
						|
 * 	* Neither the name of the SimplePie Team nor the names of its contributors may be used
 | 
						|
 * 	  to endorse or promote products derived from this software without specific prior
 | 
						|
 * 	  written permission.
 | 
						|
 *
 | 
						|
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
 | 
						|
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
						|
 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
 | 
						|
 * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
						|
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 | 
						|
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
						|
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 | 
						|
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
						|
 * POSSIBILITY OF SUCH DAMAGE.
 | 
						|
 *
 | 
						|
 * @package SimplePie
 | 
						|
 * @version 1.3.1
 | 
						|
 * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue
 | 
						|
 * @author Ryan Parman
 | 
						|
 * @author Geoffrey Sneddon
 | 
						|
 * @author Ryan McCue
 | 
						|
 * @link http://simplepie.org/ SimplePie
 | 
						|
 * @license http://www.opensource.org/licenses/bsd-license.php BSD License
 | 
						|
 */
 | 
						|
 | 
						|
/**
 | 
						|
 * Handles creating objects and calling methods
 | 
						|
 *
 | 
						|
 * Access this via {@see SimplePie::get_registry()}
 | 
						|
 *
 | 
						|
 * @package SimplePie
 | 
						|
 */
 | 
						|
class SimplePie_Registry
 | 
						|
{
 | 
						|
	/**
 | 
						|
	 * Default class mapping
 | 
						|
	 *
 | 
						|
	 * Overriding classes *must* subclass these.
 | 
						|
	 *
 | 
						|
	 * @var array
 | 
						|
	 */
 | 
						|
	protected $default = array(
 | 
						|
		'Cache' => 'SimplePie_Cache',
 | 
						|
		'Locator' => 'SimplePie_Locator',
 | 
						|
		'Parser' => 'SimplePie_Parser',
 | 
						|
		'File' => 'SimplePie_File',
 | 
						|
		'Sanitize' => 'SimplePie_Sanitize',
 | 
						|
		'Item' => 'SimplePie_Item',
 | 
						|
		'Author' => 'SimplePie_Author',
 | 
						|
		'Category' => 'SimplePie_Category',
 | 
						|
		'Enclosure' => 'SimplePie_Enclosure',
 | 
						|
		'Caption' => 'SimplePie_Caption',
 | 
						|
		'Copyright' => 'SimplePie_Copyright',
 | 
						|
		'Credit' => 'SimplePie_Credit',
 | 
						|
		'Rating' => 'SimplePie_Rating',
 | 
						|
		'Restriction' => 'SimplePie_Restriction',
 | 
						|
		'Content_Type_Sniffer' => 'SimplePie_Content_Type_Sniffer',
 | 
						|
		'Source' => 'SimplePie_Source',
 | 
						|
		'Misc' => 'SimplePie_Misc',
 | 
						|
		'XML_Declaration_Parser' => 'SimplePie_XML_Declaration_Parser',
 | 
						|
		'Parse_Date' => 'SimplePie_Parse_Date',
 | 
						|
	);
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Class mapping
 | 
						|
	 *
 | 
						|
	 * @see register()
 | 
						|
	 * @var array
 | 
						|
	 */
 | 
						|
	protected $classes = array();
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Legacy classes
 | 
						|
	 *
 | 
						|
	 * @see register()
 | 
						|
	 * @var array
 | 
						|
	 */
 | 
						|
	protected $legacy = array();
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Constructor
 | 
						|
	 *
 | 
						|
	 * No-op
 | 
						|
	 */
 | 
						|
	public function __construct() { }
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Register a class
 | 
						|
	 *
 | 
						|
	 * @param string $type See {@see $default} for names
 | 
						|
	 * @param string $class Class name, must subclass the corresponding default
 | 
						|
	 * @param bool $legacy Whether to enable legacy support for this class
 | 
						|
	 * @return bool Successfulness
 | 
						|
	 */
 | 
						|
	public function register($type, $class, $legacy = false)
 | 
						|
	{
 | 
						|
		if (!is_subclass_of($class, $this->default[$type]))
 | 
						|
		{
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		$this->classes[$type] = $class;
 | 
						|
 | 
						|
		if ($legacy)
 | 
						|
		{
 | 
						|
			$this->legacy[] = $class;
 | 
						|
		}
 | 
						|
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Get the class registered for a type
 | 
						|
	 *
 | 
						|
	 * Where possible, use {@see create()} or {@see call()} instead
 | 
						|
	 *
 | 
						|
	 * @param string $type
 | 
						|
	 * @return string|null
 | 
						|
	 */
 | 
						|
	public function get_class($type)
 | 
						|
	{
 | 
						|
		if (!empty($this->classes[$type]))
 | 
						|
		{
 | 
						|
			return $this->classes[$type];
 | 
						|
		}
 | 
						|
		if (!empty($this->default[$type]))
 | 
						|
		{
 | 
						|
			return $this->default[$type];
 | 
						|
		}
 | 
						|
 | 
						|
		return null;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Create a new instance of a given type
 | 
						|
	 *
 | 
						|
	 * @param string $type
 | 
						|
	 * @param array $parameters Parameters to pass to the constructor
 | 
						|
	 * @return object Instance of class
 | 
						|
	 */
 | 
						|
	public function &create($type, $parameters = array())
 | 
						|
	{
 | 
						|
		$class = $this->get_class($type);
 | 
						|
 | 
						|
		if (in_array($class, $this->legacy))
 | 
						|
		{
 | 
						|
			switch ($type)
 | 
						|
			{
 | 
						|
				case 'locator':
 | 
						|
					// Legacy: file, timeout, useragent, file_class, max_checked_feeds, content_type_sniffer_class
 | 
						|
					// Specified: file, timeout, useragent, max_checked_feeds
 | 
						|
					$replacement = array($this->get_class('file'), $parameters[3], $this->get_class('content_type_sniffer'));
 | 
						|
					array_splice($parameters, 3, 1, $replacement);
 | 
						|
					break;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if (!method_exists($class, '__construct'))
 | 
						|
		{
 | 
						|
			$instance = new $class;
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			$reflector = new ReflectionClass($class);
 | 
						|
			$instance = $reflector->newInstanceArgs($parameters);
 | 
						|
		}
 | 
						|
 | 
						|
		if (method_exists($instance, 'set_registry'))
 | 
						|
		{
 | 
						|
			$instance->set_registry($this);
 | 
						|
		}
 | 
						|
		return $instance;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Call a static method for a type
 | 
						|
	 *
 | 
						|
	 * @param string $type
 | 
						|
	 * @param string $method
 | 
						|
	 * @param array $parameters
 | 
						|
	 * @return mixed
 | 
						|
	 */
 | 
						|
	public function &call($type, $method, $parameters = array())
 | 
						|
	{
 | 
						|
		$class = $this->get_class($type);
 | 
						|
 | 
						|
		if (in_array($class, $this->legacy))
 | 
						|
		{
 | 
						|
			switch ($type)
 | 
						|
			{
 | 
						|
				case 'Cache':
 | 
						|
					// For backwards compatibility with old non-static
 | 
						|
					// Cache::create() methods
 | 
						|
					if ($method === 'get_handler')
 | 
						|
					{
 | 
						|
						$result = @call_user_func_array(array($class, 'create'), $parameters);
 | 
						|
						return $result;
 | 
						|
					}
 | 
						|
					break;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		$result = call_user_func_array(array($class, $method), $parameters);
 | 
						|
		return $result;
 | 
						|
	}
 | 
						|
} |