| /** | |
| * SimplePie | |
| * | |
| * A PHP-Based RSS and Atom Feed Framework. | |
| * Takes the hard work out of managing a complete RSS/Atom solution. | |
| * | |
| * Copyright (c) 2004-2016, Ryan Parman, Sam 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 | |
| * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue | |
| * @author Ryan Parman | |
| * @author Sam 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 in PHP < 8.0. | |
| // No longer supported as of PHP 8.0. | |
| 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; | |
| } | |
| } | |