Spaces:
Sleeping
Sleeping
/** | |
* 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; | |
} | |
} | |