wp/wp-includes/SimplePie/src/Registry.php
changeset 22 8c2e4d02f4ef
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wp/wp-includes/SimplePie/src/Registry.php	Fri Sep 05 18:52:52 2025 +0200
@@ -0,0 +1,271 @@
+<?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-2022, 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
+ */
+
+namespace SimplePie;
+
+use SimplePie\Content\Type\Sniffer;
+use SimplePie\Parse\Date;
+use SimplePie\XML\Declaration\Parser as DeclarationParser;
+
+/**
+ * Handles creating objects and calling methods
+ *
+ * Access this via {@see \SimplePie\SimplePie::get_registry()}
+ *
+ * @package SimplePie
+ */
+class Registry
+{
+    /**
+     * Default class mapping
+     *
+     * Overriding classes *must* subclass these.
+     *
+     * @var array<class-string, class-string>
+     */
+    protected $default = [
+        Cache::class => Cache::class,
+        Locator::class => Locator::class,
+        Parser::class => Parser::class,
+        File::class => File::class,
+        Sanitize::class => Sanitize::class,
+        Item::class => Item::class,
+        Author::class => Author::class,
+        Category::class => Category::class,
+        Enclosure::class => Enclosure::class,
+        Caption::class => Caption::class,
+        Copyright::class => Copyright::class,
+        Credit::class => Credit::class,
+        Rating::class => Rating::class,
+        Restriction::class => Restriction::class,
+        Sniffer::class => Sniffer::class,
+        Source::class => Source::class,
+        Misc::class => Misc::class,
+        DeclarationParser::class => DeclarationParser::class,
+        Date::class => Date::class,
+    ];
+
+    /**
+     * Class mapping
+     *
+     * @see register()
+     * @var array
+     */
+    protected $classes = [];
+
+    /**
+     * Legacy classes
+     *
+     * @see register()
+     * @var array<class-string>
+     */
+    protected $legacy = [];
+
+    /**
+     * Legacy types
+     *
+     * @see register()
+     * @var array<string, class-string>
+     */
+    private $legacyTypes = [
+        'Cache' => Cache::class,
+        'Locator' => Locator::class,
+        'Parser' => Parser::class,
+        'File' => File::class,
+        'Sanitize' => Sanitize::class,
+        'Item' => Item::class,
+        'Author' => Author::class,
+        'Category' => Category::class,
+        'Enclosure' => Enclosure::class,
+        'Caption' => Caption::class,
+        'Copyright' => Copyright::class,
+        'Credit' => Credit::class,
+        'Rating' => Rating::class,
+        'Restriction' => Restriction::class,
+        'Content_Type_Sniffer' => Sniffer::class,
+        'Source' => Source::class,
+        'Misc' => Misc::class,
+        'XML_Declaration_Parser' => DeclarationParser::class,
+        'Parse_Date' => Date::class,
+    ];
+
+    /**
+     * Constructor
+     *
+     * No-op
+     */
+    public function __construct()
+    {
+    }
+
+    /**
+     * Register a class
+     *
+     * @param string $type See {@see $default} for names
+     * @param class-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 (array_key_exists($type, $this->legacyTypes)) {
+            // trigger_error(sprintf('"%s"(): Using argument #1 ($type) with value "%s" is deprecated since SimplePie 1.8.0, use class-string "%s" instead.', __METHOD__, $type, $this->legacyTypes[$type]), \E_USER_DEPRECATED);
+
+            $type = $this->legacyTypes[$type];
+        }
+
+        if (!array_key_exists($type, $this->default)) {
+            return false;
+        }
+
+        if (!class_exists($class)) {
+            return false;
+        }
+
+        /** @var string */
+        $base_class = $this->default[$type];
+
+        if (!is_subclass_of($class, $base_class)) {
+            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
+     *
+     * @template T
+     * @param class-string<T> $type
+     * @return class-string<T>|null
+     */
+    public function get_class($type)
+    {
+        if (array_key_exists($type, $this->legacyTypes)) {
+            // trigger_error(sprintf('"%s"(): Using argument #1 ($type) with value "%s" is deprecated since SimplePie 1.8.0, use class-string "%s" instead.', __METHOD__, $type, $this->legacyTypes[$type]), \E_USER_DEPRECATED);
+
+            $type = $this->legacyTypes[$type];
+        }
+
+        if (!array_key_exists($type, $this->default)) {
+            return null;
+        }
+
+        $class = $this->default[$type];
+
+        if (array_key_exists($type, $this->classes)) {
+            $class = $this->classes[$type];
+        }
+
+        return $class;
+    }
+
+    /**
+     * Create a new instance of a given type
+     *
+     * @template T class-string $type
+     * @param class-string<T> $type
+     * @param array $parameters Parameters to pass to the constructor
+     * @return T Instance of class
+     */
+    public function &create($type, $parameters = [])
+    {
+        $class = $this->get_class($type);
+
+        if (!method_exists($class, '__construct')) {
+            $instance = new $class();
+        } else {
+            $reflector = new \ReflectionClass($class);
+            $instance = $reflector->newInstanceArgs($parameters);
+        }
+
+        if ($instance instanceof RegistryAware) {
+            $instance->set_registry($this);
+        } elseif (method_exists($instance, 'set_registry')) {
+            trigger_error(sprintf('Using the method "set_registry()" without implementing "%s" is deprecated since SimplePie 1.8.0, implement "%s" in "%s".', RegistryAware::class, RegistryAware::class, $class), \E_USER_DEPRECATED);
+            $instance->set_registry($this);
+        }
+        return $instance;
+    }
+
+    /**
+     * Call a static method for a type
+     *
+     * @param class-string $type
+     * @param string $method
+     * @param array $parameters
+     * @return mixed
+     */
+    public function &call($type, $method, $parameters = [])
+    {
+        $class = $this->get_class($type);
+
+        if (in_array($class, $this->legacy)) {
+            switch ($type) {
+                case Cache::class:
+                    // 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([$class, 'create'], $parameters);
+                        return $result;
+                    }
+                    break;
+            }
+        }
+
+        $result = call_user_func_array([$class, $method], $parameters);
+        return $result;
+    }
+}
+
+class_alias('SimplePie\Registry', 'SimplePie_Registry');