Wordpress 3.5
[autoinstalls/wordpress.git] / wp-includes / class-simplepie.php
index 6128495d88c08007cc799d0c71f59ff83e310330..ba6f28dba0a5f98d31d023885fc25a7908db2e04 100644 (file)
@@ -1,12 +1,71 @@
 <?php
 if ( ! class_exists( 'SimplePie' ) ) :
+
+// Load classes we will need.
+require ABSPATH . WPINC . '/SimplePie/Misc.php';
+require ABSPATH . WPINC . '/SimplePie/Cache.php';
+require ABSPATH . WPINC . '/SimplePie/File.php';
+require ABSPATH . WPINC . '/SimplePie/Sanitize.php';
+require ABSPATH . WPINC . '/SimplePie/Registry.php';
+require ABSPATH . WPINC . '/SimplePie/IRI.php';
+require ABSPATH . WPINC . '/SimplePie/Locator.php';
+require ABSPATH . WPINC . '/SimplePie/Content/Type/Sniffer.php';
+require ABSPATH . WPINC . '/SimplePie/XML/Declaration/Parser.php';
+require ABSPATH . WPINC . '/SimplePie/Parser.php';
+require ABSPATH . WPINC . '/SimplePie/Item.php';
+require ABSPATH . WPINC . '/SimplePie/Parse/Date.php';
+require ABSPATH . WPINC . '/SimplePie/Author.php';
+
+/**
+ * WordPress autoloader for SimplePie.
+ *
+ * @since 3.5.0
+ */
+function wp_simplepie_autoload( $class ) {
+       if ( 0 !== strpos( $class, 'SimplePie_' ) )
+               return;
+
+       $file = ABSPATH . WPINC . '/' . str_replace( '_', '/', $class ) . '.php';
+       include $file;
+}
+
+if ( function_exists( 'spl_autoload_register' ) ) {
+       /**
+        * We autoload classes we may not need.
+        *
+        * If SPL is disabled, we load all of SimplePie manually.
+        *
+        * Core.php is not loaded manually, because SimplePie_Core (a deprecated class)
+        * was never included in WordPress core.
+        */
+       spl_autoload_register( 'wp_simplepie_autoload' );
+} else {
+       require ABSPATH . WPINC . '/SimplePie/Cache/Base.php';
+       require ABSPATH . WPINC . '/SimplePie/Cache/DB.php';
+       require ABSPATH . WPINC . '/SimplePie/Cache/File.php';
+       require ABSPATH . WPINC . '/SimplePie/Cache/Memcache.php';
+       require ABSPATH . WPINC . '/SimplePie/Cache/MySQL.php';
+       require ABSPATH . WPINC . '/SimplePie/Caption.php';
+       require ABSPATH . WPINC . '/SimplePie/Category.php';
+       require ABSPATH . WPINC . '/SimplePie/Copyright.php';
+       require ABSPATH . WPINC . '/SimplePie/Credit.php';
+       require ABSPATH . WPINC . '/SimplePie/Decode/HTML/Entities.php';
+       require ABSPATH . WPINC . '/SimplePie/Enclosure.php';
+       require ABSPATH . WPINC . '/SimplePie/gzdecode.php';
+       require ABSPATH . WPINC . '/SimplePie/HTTP/Parser.php';
+       require ABSPATH . WPINC . '/SimplePie/Net/IPv6.php';
+       require ABSPATH . WPINC . '/SimplePie/Rating.php';
+       require ABSPATH . WPINC . '/SimplePie/Restriction.php';
+       require ABSPATH . WPINC . '/SimplePie/Source.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-2011, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors
+ * 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
@@ -34,15 +93,13 @@ if ( ! class_exists( 'SimplePie' ) ) :
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * @package SimplePie
- * @version 1.2.1
- * @copyright 2004-2011 Ryan Parman, Geoffrey Sneddon, Ryan McCue
+ * @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
- * @link http://simplepie.org/support/ Please submit all bug reports and feature requests to the SimplePie forums
  * @license http://www.opensource.org/licenses/bsd-license.php BSD License
- * @todo phpDoc comments
  */
 
 /**
@@ -53,12 +110,13 @@ define('SIMPLEPIE_NAME', 'SimplePie');
 /**
  * SimplePie Version
  */
-define('SIMPLEPIE_VERSION', '1.2.1');
+define('SIMPLEPIE_VERSION', '1.3.1');
 
 /**
  * SimplePie Build
+ * @todo Hardcode for release (there's no need to have to call SimplePie_Misc::get_build() only every load of simplepie.inc)
  */
-define('SIMPLEPIE_BUILD', '20111015034325');
+define('SIMPLEPIE_BUILD', gmdate('YmdHis', SimplePie_Misc::get_build()));
 
 /**
  * SimplePie Website URL
@@ -335,10 +393,30 @@ define('SIMPLEPIE_NAMESPACE_GEORSS', 'http://www.georss.org/georss');
 define('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/');
 
 /**
- * Wrong Media RSS Namespace
+ * Wrong Media RSS Namespace. Caused by a long-standing typo in the spec.
  */
 define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss');
 
+/**
+ * Wrong Media RSS Namespace #2. New namespace introduced in Media RSS 1.5.
+ */
+define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2', 'http://video.search.yahoo.com/mrss');
+
+/**
+ * Wrong Media RSS Namespace #3. A possible typo of the Media RSS 1.5 namespace.
+ */
+define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3', 'http://video.search.yahoo.com/mrss/');
+
+/**
+ * Wrong Media RSS Namespace #4. New spec location after the RSS Advisory Board takes it over, but not a valid namespace.
+ */
+define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4', 'http://www.rssboard.org/media-rss');
+
+/**
+ * Wrong Media RSS Namespace #5. A possible typo of the RSS Advisory Board URL.
+ */
+define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5', 'http://www.rssboard.org/media-rss/');
+
 /**
  * iTunes RSS Namespace
  */
@@ -354,11 +432,6 @@ define('SIMPLEPIE_NAMESPACE_XHTML', 'http://www.w3.org/1999/xhtml');
  */
 define('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignments/relation/');
 
-/**
- * Whether we're running on PHP5
- */
-define('SIMPLEPIE_PHP5', version_compare(PHP_VERSION, '5.0.0', '>='));
-
 /**
  * No file source
  */
@@ -389,10 +462,13 @@ define('SIMPLEPIE_FILE_SOURCE_CURL', 8);
  */
 define('SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS', 16);
 
+
+
 /**
  * SimplePie
  *
  * @package SimplePie
+ * @subpackage API
  */
 class SimplePie
 {
@@ -400,55 +476,55 @@ class SimplePie
         * @var array Raw data
         * @access private
         */
-       var $data = array();
+       public $data = array();
 
        /**
         * @var mixed Error string
         * @access private
         */
-       var $error;
+       public $error;
 
        /**
         * @var object Instance of SimplePie_Sanitize (or other class)
         * @see SimplePie::set_sanitize_class()
         * @access private
         */
-       var $sanitize;
+       public $sanitize;
 
        /**
         * @var string SimplePie Useragent
         * @see SimplePie::set_useragent()
         * @access private
         */
-       var $useragent = SIMPLEPIE_USERAGENT;
+       public $useragent = SIMPLEPIE_USERAGENT;
 
        /**
         * @var string Feed URL
         * @see SimplePie::set_feed_url()
         * @access private
         */
-       var $feed_url;
+       public $feed_url;
 
        /**
         * @var object Instance of SimplePie_File to use as a feed
         * @see SimplePie::set_file()
         * @access private
         */
-       var $file;
+       public $file;
 
        /**
         * @var string Raw feed data
         * @see SimplePie::set_raw_data()
         * @access private
         */
-       var $raw_data;
+       public $raw_data;
 
        /**
         * @var int Timeout for fetching remote files
         * @see SimplePie::set_timeout()
         * @access private
         */
-       var $timeout = 10;
+       public $timeout = 10;
 
        /**
         * @var bool Forces fsockopen() to be used for remote files instead
@@ -456,7 +532,7 @@ class SimplePie
         * @see SimplePie::force_fsockopen()
         * @access private
         */
-       var $force_fsockopen = false;
+       public $force_fsockopen = false;
 
        /**
         * @var bool Force the given data/URL to be treated as a feed no matter what
@@ -464,56 +540,49 @@ class SimplePie
         * @see SimplePie::force_feed()
         * @access private
         */
-       var $force_feed = false;
-
-       /**
-        * @var bool Enable/Disable XML dump
-        * @see SimplePie::enable_xml_dump()
-        * @access private
-        */
-       var $xml_dump = false;
+       public $force_feed = false;
 
        /**
         * @var bool Enable/Disable Caching
         * @see SimplePie::enable_cache()
         * @access private
         */
-       var $cache = true;
+       public $cache = true;
 
        /**
         * @var int Cache duration (in seconds)
         * @see SimplePie::set_cache_duration()
         * @access private
         */
-       var $cache_duration = 3600;
+       public $cache_duration = 3600;
 
        /**
         * @var int Auto-discovery cache duration (in seconds)
         * @see SimplePie::set_autodiscovery_cache_duration()
         * @access private
         */
-       var $autodiscovery_cache_duration = 604800; // 7 Days.
+       public $autodiscovery_cache_duration = 604800; // 7 Days.
 
        /**
         * @var string Cache location (relative to executing script)
         * @see SimplePie::set_cache_location()
         * @access private
         */
-       var $cache_location = './cache';
+       public $cache_location = './cache';
 
        /**
         * @var string Function that creates the cache filename
         * @see SimplePie::set_cache_name_function()
         * @access private
         */
-       var $cache_name_function = 'md5';
+       public $cache_name_function = 'md5';
 
        /**
         * @var bool Reorder feed by date descending
         * @see SimplePie::enable_order_by_date()
         * @access private
         */
-       var $order_by_date = true;
+       public $order_by_date = true;
 
        /**
         * @var mixed Force input encoding to be set to the follow value
@@ -521,246 +590,132 @@ class SimplePie
         * @see SimplePie::set_input_encoding()
         * @access private
         */
-       var $input_encoding = false;
+       public $input_encoding = false;
 
        /**
         * @var int Feed Autodiscovery Level
         * @see SimplePie::set_autodiscovery_level()
         * @access private
         */
-       var $autodiscovery = SIMPLEPIE_LOCATOR_ALL;
-
-       /**
-        * @var string Class used for caching feeds
-        * @see SimplePie::set_cache_class()
-        * @access private
-        */
-       var $cache_class = 'SimplePie_Cache';
-
-       /**
-        * @var string Class used for locating feeds
-        * @see SimplePie::set_locator_class()
-        * @access private
-        */
-       var $locator_class = 'SimplePie_Locator';
-
-       /**
-        * @var string Class used for parsing feeds
-        * @see SimplePie::set_parser_class()
-        * @access private
-        */
-       var $parser_class = 'SimplePie_Parser';
-
-       /**
-        * @var string Class used for fetching feeds
-        * @see SimplePie::set_file_class()
-        * @access private
-        */
-       var $file_class = 'SimplePie_File';
-
-       /**
-        * @var string Class used for items
-        * @see SimplePie::set_item_class()
-        * @access private
-        */
-       var $item_class = 'SimplePie_Item';
-
-       /**
-        * @var string Class used for authors
-        * @see SimplePie::set_author_class()
-        * @access private
-        */
-       var $author_class = 'SimplePie_Author';
-
-       /**
-        * @var string Class used for categories
-        * @see SimplePie::set_category_class()
-        * @access private
-        */
-       var $category_class = 'SimplePie_Category';
-
-       /**
-        * @var string Class used for enclosures
-        * @see SimplePie::set_enclosures_class()
-        * @access private
-        */
-       var $enclosure_class = 'SimplePie_Enclosure';
-
-       /**
-        * @var string Class used for Media RSS <media:text> captions
-        * @see SimplePie::set_caption_class()
-        * @access private
-        */
-       var $caption_class = 'SimplePie_Caption';
-
-       /**
-        * @var string Class used for Media RSS <media:copyright>
-        * @see SimplePie::set_copyright_class()
-        * @access private
-        */
-       var $copyright_class = 'SimplePie_Copyright';
-
-       /**
-        * @var string Class used for Media RSS <media:credit>
-        * @see SimplePie::set_credit_class()
-        * @access private
-        */
-       var $credit_class = 'SimplePie_Credit';
-
-       /**
-        * @var string Class used for Media RSS <media:rating>
-        * @see SimplePie::set_rating_class()
-        * @access private
-        */
-       var $rating_class = 'SimplePie_Rating';
-
-       /**
-        * @var string Class used for Media RSS <media:restriction>
-        * @see SimplePie::set_restriction_class()
-        * @access private
-        */
-       var $restriction_class = 'SimplePie_Restriction';
-
-       /**
-        * @var string Class used for content-type sniffing
-        * @see SimplePie::set_content_type_sniffer_class()
-        * @access private
-        */
-       var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer';
-
-       /**
-        * @var string Class used for item sources.
-        * @see SimplePie::set_source_class()
-        * @access private
-        */
-       var $source_class = 'SimplePie_Source';
+       public $autodiscovery = SIMPLEPIE_LOCATOR_ALL;
 
        /**
-        * @var mixed Set javascript query string parameter (false, or
-        * anything type-cast to false, disables this feature)
-        * @see SimplePie::set_javascript()
-        * @access private
+        * Class registry object
+        *
+        * @var SimplePie_Registry
         */
-       var $javascript = 'js';
+       public $registry;
 
        /**
         * @var int Maximum number of feeds to check with autodiscovery
         * @see SimplePie::set_max_checked_feeds()
         * @access private
         */
-       var $max_checked_feeds = 10;
+       public $max_checked_feeds = 10;
 
        /**
         * @var array All the feeds found during the autodiscovery process
         * @see SimplePie::get_all_discovered_feeds()
         * @access private
         */
-       var $all_discovered_feeds = array();
-
-       /**
-        * @var string Web-accessible path to the handler_favicon.php file.
-        * @see SimplePie::set_favicon_handler()
-        * @access private
-        */
-       var $favicon_handler = '';
+       public $all_discovered_feeds = array();
 
        /**
         * @var string Web-accessible path to the handler_image.php file.
         * @see SimplePie::set_image_handler()
         * @access private
         */
-       var $image_handler = '';
+       public $image_handler = '';
 
        /**
         * @var array Stores the URLs when multiple feeds are being initialized.
         * @see SimplePie::set_feed_url()
         * @access private
         */
-       var $multifeed_url = array();
+       public $multifeed_url = array();
 
        /**
         * @var array Stores SimplePie objects when multiple feeds initialized.
         * @access private
         */
-       var $multifeed_objects = array();
+       public $multifeed_objects = array();
 
        /**
         * @var array Stores the get_object_vars() array for use with multifeeds.
         * @see SimplePie::set_feed_url()
         * @access private
         */
-       var $config_settings = null;
+       public $config_settings = null;
 
        /**
         * @var integer Stores the number of items to return per-feed with multifeeds.
         * @see SimplePie::set_item_limit()
         * @access private
         */
-       var $item_limit = 0;
+       public $item_limit = 0;
 
        /**
         * @var array Stores the default attributes to be stripped by strip_attributes().
         * @see SimplePie::strip_attributes()
         * @access private
         */
-       var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
+       public $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc');
 
        /**
         * @var array Stores the default tags to be stripped by strip_htmltags().
         * @see SimplePie::strip_htmltags()
         * @access private
         */
-       var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
+       public $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style');
 
        /**
         * The SimplePie class contains feed level data and options
         *
-        * There are two ways that you can create a new SimplePie object. The first
-        * is by passing a feed URL as a parameter to the SimplePie constructor
-        * (as well as optionally setting the cache location and cache expiry). This
-        * will initialise the whole feed with all of the default settings, and you
-        * can begin accessing methods and properties immediately.
-        *
-        * The second way is to create the SimplePie object with no parameters
-        * at all. This will enable you to set configuration options. After setting
+        * To use SimplePie, create the SimplePie object with no parameters. You can
+        * then set configuration options using the provided methods. After setting
         * them, you must initialise the feed using $feed->init(). At that point the
-        * object's methods and properties will be available to you. This format is
-        * what is used throughout this documentation.
+        * object's methods and properties will be available to you.
+        *
+        * Previously, it was possible to pass in the feed URL along with cache
+        * options directly into the constructor. This has been removed as of 1.3 as
+        * it caused a lot of confusion.
         *
-        * @access public
         * @since 1.0 Preview Release
-        * @param string $feed_url This is the URL you want to parse.
-        * @param string $cache_location This is where you want the cache to be stored.
-        * @param int $cache_duration This is the number of seconds that you want to store the cache file for.
         */
-       function SimplePie($feed_url = null, $cache_location = null, $cache_duration = null)
+       public function __construct()
        {
-               // Other objects, instances created here so we can set options on them
-               $this->sanitize =& new SimplePie_Sanitize;
-
-               // Set options if they're passed to the constructor
-               if ($cache_location !== null)
+               if (version_compare(PHP_VERSION, '5.2', '<'))
                {
-                       $this->set_cache_location($cache_location);
+                       trigger_error('PHP 4.x, 5.0 and 5.1 are no longer supported. Please upgrade to PHP 5.2 or newer.');
+                       die();
                }
 
-               if ($cache_duration !== null)
-               {
-                       $this->set_cache_duration($cache_duration);
-               }
+               // Other objects, instances created here so we can set options on them
+               $this->sanitize = new SimplePie_Sanitize();
+               $this->registry = new SimplePie_Registry();
 
-               // Only init the script if we're passed a feed URL
-               if ($feed_url !== null)
+               if (func_num_args() > 0)
                {
-                       $this->set_feed_url($feed_url);
-                       $this->init();
+                       $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
+                       trigger_error('Passing parameters to the constructor is no longer supported. Please use set_feed_url(), set_cache_location(), and set_cache_location() directly.', $level);
+
+                       $args = func_get_args();
+                       switch (count($args)) {
+                               case 3:
+                                       $this->set_cache_duration($args[2]);
+                               case 2:
+                                       $this->set_cache_location($args[1]);
+                               case 1:
+                                       $this->set_feed_url($args[0]);
+                                       $this->init();
+                       }
                }
        }
 
        /**
         * Used for converting object to a string
         */
-       function __toString()
+       public function __toString()
        {
                return md5(serialize($this->data));
        }
@@ -768,7 +723,7 @@ class SimplePie
        /**
         * Remove items that link back to this before destroying this object
         */
-       function __destruct()
+       public function __destruct()
        {
                if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
                {
@@ -792,20 +747,21 @@ class SimplePie
        }
 
        /**
-        * Force the given data/URL to be treated as a feed no matter what it
-        * appears like
+        * Force the given data/URL to be treated as a feed
+        *
+        * This tells SimplePie to ignore the content-type provided by the server.
+        * Be careful when using this option, as it will also disable autodiscovery.
         *
-        * @access public
         * @since 1.1
         * @param bool $enable Force the given data/URL to be treated as a feed
         */
-       function force_feed($enable = false)
+       public function force_feed($enable = false)
        {
                $this->force_feed = (bool) $enable;
        }
 
        /**
-        * This is the URL of the feed you want to parse.
+        * Set the URL of the feed you want to parse
         *
         * This allows you to enter the URL of the feed you want to parse, or the
         * website you want to try to use auto-discovery on. This takes priority
@@ -815,37 +771,35 @@ class SimplePie
         * of a string for the $url. Remember that with each additional feed comes
         * additional processing and resources.
         *
-        * @access public
         * @since 1.0 Preview Release
-        * @param mixed $url This is the URL (or array of URLs) that you want to parse.
-        * @see SimplePie::set_raw_data()
+        * @see set_raw_data()
+        * @param string|array $url This is the URL (or array of URLs) that you want to parse.
         */
-       function set_feed_url($url)
+       public function set_feed_url($url)
        {
+               $this->multifeed_url = array();
                if (is_array($url))
                {
-                       $this->multifeed_url = array();
                        foreach ($url as $value)
                        {
-                               $this->multifeed_url[] = SimplePie_Misc::fix_protocol($value, 1);
+                               $this->multifeed_url[] = $this->registry->call('Misc', 'fix_protocol', array($value, 1));
                        }
                }
                else
                {
-                       $this->feed_url = SimplePie_Misc::fix_protocol($url, 1);
+                       $this->feed_url = $this->registry->call('Misc', 'fix_protocol', array($url, 1));
                }
        }
 
        /**
-        * Provides an instance of SimplePie_File to use as a feed
+        * Set an instance of {@see SimplePie_File} to use as a feed
         *
-        * @access public
-        * @param object &$file Instance of SimplePie_File (or subclass)
+        * @param SimplePie_File &$file
         * @return bool True on success, false on failure
         */
-       function set_file(&$file)
+       public function set_file(&$file)
        {
-               if (is_a($file, 'SimplePie_File'))
+               if ($file instanceof SimplePie_File)
                {
                        $this->feed_url = $file->url;
                        $this->file =& $file;
@@ -855,138 +809,113 @@ class SimplePie
        }
 
        /**
+        * Set the raw XML data to parse
+        *
         * Allows you to use a string of RSS/Atom data instead of a remote feed.
         *
         * If you have a feed available as a string in PHP, you can tell SimplePie
         * to parse that data string instead of a remote feed. Any set feed URL
         * takes precedence.
         *
-        * @access public
         * @since 1.0 Beta 3
         * @param string $data RSS or Atom data as a string.
-        * @see SimplePie::set_feed_url()
+        * @see set_feed_url()
         */
-       function set_raw_data($data)
+       public function set_raw_data($data)
        {
                $this->raw_data = $data;
        }
 
        /**
-        * Allows you to override the default timeout for fetching remote feeds.
+        * Set the the default timeout for fetching remote feeds
         *
         * This allows you to change the maximum time the feed's server to respond
         * and send the feed back.
         *
-        * @access public
         * @since 1.0 Beta 3
         * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed.
         */
-       function set_timeout($timeout = 10)
+       public function set_timeout($timeout = 10)
        {
                $this->timeout = (int) $timeout;
        }
 
        /**
-        * Forces SimplePie to use fsockopen() instead of the preferred cURL
-        * functions.
+        * Force SimplePie to use fsockopen() instead of cURL
         *
-        * @access public
         * @since 1.0 Beta 3
         * @param bool $enable Force fsockopen() to be used
         */
-       function force_fsockopen($enable = false)
+       public function force_fsockopen($enable = false)
        {
                $this->force_fsockopen = (bool) $enable;
        }
 
        /**
-        * Outputs the raw XML content of the feed, after it has gone through
-        * SimplePie's filters.
-        *
-        * Used only for debugging, this function will output the XML content as
-        * text/xml. When SimplePie reads in a feed, it does a bit of cleaning up
-        * before trying to parse it. Many parts of the feed are re-written in
-        * memory, and in the end, you have a parsable feed. XML dump shows you the
-        * actual XML that SimplePie tries to parse, which may or may not be very
-        * different from the original feed.
-        *
-        * @access public
-        * @since 1.0 Preview Release
-        * @param bool $enable Enable XML dump
-        */
-       function enable_xml_dump($enable = false)
-       {
-               $this->xml_dump = (bool) $enable;
-       }
-
-       /**
-        * Enables/disables caching in SimplePie.
+        * Enable/disable caching in SimplePie.
         *
         * This option allows you to disable caching all-together in SimplePie.
         * However, disabling the cache can lead to longer load times.
         *
-        * @access public
         * @since 1.0 Preview Release
         * @param bool $enable Enable caching
         */
-       function enable_cache($enable = true)
+       public function enable_cache($enable = true)
        {
                $this->cache = (bool) $enable;
        }
 
        /**
-        * Set the length of time (in seconds) that the contents of a feed
-        * will be cached.
+        * Set the length of time (in seconds) that the contents of a feed will be
+        * cached
         *
-        * @access public
-        * @param int $seconds The feed content cache duration.
+        * @param int $seconds The feed content cache duration
         */
-       function set_cache_duration($seconds = 3600)
+       public function set_cache_duration($seconds = 3600)
        {
                $this->cache_duration = (int) $seconds;
        }
 
        /**
-        * Set the length of time (in seconds) that the autodiscovered feed
-        * URL will be cached.
+        * Set the length of time (in seconds) that the autodiscovered feed URL will
+        * be cached
         *
-        * @access public
         * @param int $seconds The autodiscovered feed URL cache duration.
         */
-       function set_autodiscovery_cache_duration($seconds = 604800)
+       public function set_autodiscovery_cache_duration($seconds = 604800)
        {
                $this->autodiscovery_cache_duration = (int) $seconds;
        }
 
        /**
-        * Set the file system location where the cached files should be stored.
+        * Set the file system location where the cached files should be stored
         *
-        * @access public
         * @param string $location The file system location.
         */
-       function set_cache_location($location = './cache')
+       public function set_cache_location($location = './cache')
        {
                $this->cache_location = (string) $location;
        }
 
        /**
-        * Determines whether feed items should be sorted into reverse chronological order.
+        * Set whether feed items should be sorted into reverse chronological order
         *
-        * @access public
         * @param bool $enable Sort as reverse chronological order.
         */
-       function enable_order_by_date($enable = true)
+       public function enable_order_by_date($enable = true)
        {
                $this->order_by_date = (bool) $enable;
        }
 
        /**
-        * Allows you to override the character encoding reported by the feed.
+        * Set the character encoding used to parse the feed
         *
-        * @access public
-        * @param string $encoding Character encoding.
+        * This overrides the encoding reported by the feed, however it will fall
+        * back to the normal encoding detection if the override fails
+        *
+        * @param string $encoding Character encoding
         */
-       function set_input_encoding($encoding = false)
+       public function set_input_encoding($encoding = false)
        {
                if ($encoding)
                {
@@ -1001,7 +930,6 @@ class SimplePie
        /**
         * Set how much feed autodiscovery to do
         *
-        * @access public
         * @see SIMPLEPIE_LOCATOR_NONE
         * @see SIMPLEPIE_LOCATOR_AUTODISCOVERY
         * @see SIMPLEPIE_LOCATOR_LOCAL_EXTENSION
@@ -1009,325 +937,168 @@ class SimplePie
         * @see SIMPLEPIE_LOCATOR_REMOTE_EXTENSION
         * @see SIMPLEPIE_LOCATOR_REMOTE_BODY
         * @see SIMPLEPIE_LOCATOR_ALL
-        * @param int $level Feed Autodiscovery Level (level can be a
-        * combination of the above constants, see bitwise OR operator)
+        * @param int $level Feed Autodiscovery Level (level can be a combination of the above constants, see bitwise OR operator)
         */
-       function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL)
+       public function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL)
        {
                $this->autodiscovery = (int) $level;
        }
 
        /**
-        * Allows you to change which class SimplePie uses for caching.
-        * Useful when you are overloading or extending SimplePie's default classes.
+        * Get the class registry
         *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Use this to override SimplePie's default classes
+        * @see SimplePie_Registry
+        * @return SimplePie_Registry
         */
-       function set_cache_class($class = 'SimplePie_Cache')
+       public function &get_registry()
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Cache'))
-               {
-                       $this->cache_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry;
        }
 
-       /**
-        * Allows you to change which class SimplePie uses for auto-discovery.
+       /**#@+
         * Useful when you are overloading or extending SimplePie's default classes.
         *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
+        * @deprecated Use {@see get_registry()} instead
         * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * @param string $class Name of custom class
+        * @return boolean True on success, false otherwise
         */
-       function set_locator_class($class = 'SimplePie_Locator')
+       /**
+        * Set which class SimplePie uses for caching
+        */
+       public function set_cache_class($class = 'SimplePie_Cache')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Locator'))
-               {
-                       $this->locator_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('Cache', $class, true);
        }
 
        /**
-        * Allows you to change which class SimplePie uses for XML parsing.
-        * Useful when you are overloading or extending SimplePie's default classes.
-        *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Set which class SimplePie uses for auto-discovery
         */
-       function set_parser_class($class = 'SimplePie_Parser')
+       public function set_locator_class($class = 'SimplePie_Locator')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Parser'))
-               {
-                       $this->parser_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('Locator', $class, true);
        }
 
        /**
-        * Allows you to change which class SimplePie uses for remote file fetching.
-        * Useful when you are overloading or extending SimplePie's default classes.
-        *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Set which class SimplePie uses for XML parsing
         */
-       function set_file_class($class = 'SimplePie_File')
+       public function set_parser_class($class = 'SimplePie_Parser')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_File'))
-               {
-                       $this->file_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('Parser', $class, true);
        }
 
        /**
-        * Allows you to change which class SimplePie uses for data sanitization.
-        * Useful when you are overloading or extending SimplePie's default classes.
-        *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Set which class SimplePie uses for remote file fetching
         */
-       function set_sanitize_class($class = 'SimplePie_Sanitize')
+       public function set_file_class($class = 'SimplePie_File')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Sanitize'))
-               {
-                       $this->sanitize =& new $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('File', $class, true);
        }
 
        /**
-        * Allows you to change which class SimplePie uses for handling feed items.
-        * Useful when you are overloading or extending SimplePie's default classes.
-        *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Set which class SimplePie uses for data sanitization
         */
-       function set_item_class($class = 'SimplePie_Item')
+       public function set_sanitize_class($class = 'SimplePie_Sanitize')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Item'))
-               {
-                       $this->item_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('Sanitize', $class, true);
        }
 
        /**
-        * Allows you to change which class SimplePie uses for handling author data.
-        * Useful when you are overloading or extending SimplePie's default classes.
-        *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Set which class SimplePie uses for handling feed items
         */
-       function set_author_class($class = 'SimplePie_Author')
+       public function set_item_class($class = 'SimplePie_Item')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Author'))
-               {
-                       $this->author_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('Item', $class, true);
        }
 
        /**
-        * Allows you to change which class SimplePie uses for handling category data.
-        * Useful when you are overloading or extending SimplePie's default classes.
-        *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Set which class SimplePie uses for handling author data
         */
-       function set_category_class($class = 'SimplePie_Category')
+       public function set_author_class($class = 'SimplePie_Author')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Category'))
-               {
-                       $this->category_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('Author', $class, true);
        }
 
        /**
-        * Allows you to change which class SimplePie uses for feed enclosures.
-        * Useful when you are overloading or extending SimplePie's default classes.
-        *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Set which class SimplePie uses for handling category data
         */
-       function set_enclosure_class($class = 'SimplePie_Enclosure')
+       public function set_category_class($class = 'SimplePie_Category')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Enclosure'))
-               {
-                       $this->enclosure_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('Category', $class, true);
        }
 
        /**
-        * Allows you to change which class SimplePie uses for <media:text> captions
-        * Useful when you are overloading or extending SimplePie's default classes.
-        *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Set which class SimplePie uses for feed enclosures
         */
-       function set_caption_class($class = 'SimplePie_Caption')
+       public function set_enclosure_class($class = 'SimplePie_Enclosure')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Caption'))
-               {
-                       $this->caption_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('Enclosure', $class, true);
        }
 
        /**
-        * Allows you to change which class SimplePie uses for <media:copyright>
-        * Useful when you are overloading or extending SimplePie's default classes.
-        *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Set which class SimplePie uses for `<media:text>` captions
         */
-       function set_copyright_class($class = 'SimplePie_Copyright')
+       public function set_caption_class($class = 'SimplePie_Caption')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Copyright'))
-               {
-                       $this->copyright_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('Caption', $class, true);
        }
 
        /**
-        * Allows you to change which class SimplePie uses for <media:credit>
-        * Useful when you are overloading or extending SimplePie's default classes.
-        *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Set which class SimplePie uses for `<media:copyright>`
         */
-       function set_credit_class($class = 'SimplePie_Credit')
+       public function set_copyright_class($class = 'SimplePie_Copyright')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Credit'))
-               {
-                       $this->credit_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('Copyright', $class, true);
        }
 
        /**
-        * Allows you to change which class SimplePie uses for <media:rating>
-        * Useful when you are overloading or extending SimplePie's default classes.
-        *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Set which class SimplePie uses for `<media:credit>`
         */
-       function set_rating_class($class = 'SimplePie_Rating')
+       public function set_credit_class($class = 'SimplePie_Credit')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Rating'))
-               {
-                       $this->rating_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('Credit', $class, true);
        }
 
        /**
-        * Allows you to change which class SimplePie uses for <media:restriction>
-        * Useful when you are overloading or extending SimplePie's default classes.
-        *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Set which class SimplePie uses for `<media:rating>`
         */
-       function set_restriction_class($class = 'SimplePie_Restriction')
+       public function set_rating_class($class = 'SimplePie_Rating')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Restriction'))
-               {
-                       $this->restriction_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('Rating', $class, true);
        }
 
        /**
-        * Allows you to change which class SimplePie uses for content-type sniffing.
-        * Useful when you are overloading or extending SimplePie's default classes.
-        *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Set which class SimplePie uses for `<media:restriction>`
         */
-       function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer')
+       public function set_restriction_class($class = 'SimplePie_Restriction')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Content_Type_Sniffer'))
-               {
-                       $this->content_type_sniffer_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('Restriction', $class, true);
        }
 
        /**
-        * Allows you to change which class SimplePie uses item sources.
-        * Useful when you are overloading or extending SimplePie's default classes.
-        *
-        * @access public
-        * @param string $class Name of custom class.
-        * @link http://php.net/manual/en/keyword.extends.php PHP4 extends documentation
-        * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation
+        * Set which class SimplePie uses for content-type sniffing
         */
-       function set_source_class($class = 'SimplePie_Source')
+       public function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer')
        {
-               if (SimplePie_Misc::is_subclass_of($class, 'SimplePie_Source'))
-               {
-                       $this->source_class = $class;
-                       return true;
-               }
-               return false;
+               return $this->registry->register('Content_Type_Sniffer', $class, true);
+       }
+
+       /**
+        * Set which class SimplePie uses item sources
+        */
+       public function set_source_class($class = 'SimplePie_Source')
+       {
+               return $this->registry->register('Source', $class, true);
        }
+       /**#@-*/
 
        /**
-        * Allows you to override the default user agent string.
+        * Set the user agent string
         *
-        * @access public
         * @param string $ua New user agent string.
         */
-       function set_useragent($ua = SIMPLEPIE_USERAGENT)
+       public function set_useragent($ua = SIMPLEPIE_USERAGENT)
        {
                $this->useragent = (string) $ua;
        }
@@ -1335,10 +1106,9 @@ class SimplePie
        /**
         * Set callback function to create cache filename with
         *
-        * @access public
         * @param mixed $function Callback function
         */
-       function set_cache_name_function($function = 'md5')
+       public function set_cache_name_function($function = 'md5')
        {
                if (is_callable($function))
                {
@@ -1347,31 +1117,14 @@ class SimplePie
        }
 
        /**
-        * Set javascript query string parameter
+        * Set options to make SP as fast as possible
         *
-        * @access public
-        * @param mixed $get Javascript query string parameter
-        */
-       function set_javascript($get = 'js')
-       {
-               if ($get)
-               {
-                       $this->javascript = (string) $get;
-               }
-               else
-               {
-                       $this->javascript = false;
-               }
-       }
-
-       /**
-        * Set options to make SP as fast as possible.  Forgoes a
-        * substantial amount of data sanitization in favor of speed.
+        * Forgoes a substantial amount of data sanitization in favor of speed. This
+        * turns SimplePie into a dumb parser of feeds.
         *
-        * @access public
         * @param bool $set Whether to set them or not
         */
-       function set_stupidly_fast($set = false)
+       public function set_stupidly_fast($set = false)
        {
                if ($set)
                {
@@ -1387,20 +1140,19 @@ class SimplePie
        /**
         * Set maximum number of feeds to check with autodiscovery
         *
-        * @access public
         * @param int $max Maximum number of feeds to check
         */
-       function set_max_checked_feeds($max = 10)
+       public function set_max_checked_feeds($max = 10)
        {
                $this->max_checked_feeds = (int) $max;
        }
 
-       function remove_div($enable = true)
+       public function remove_div($enable = true)
        {
                $this->sanitize->remove_div($enable);
        }
 
-       function strip_htmltags($tags = '', $encode = null)
+       public function strip_htmltags($tags = '', $encode = null)
        {
                if ($tags === '')
                {
@@ -1413,12 +1165,12 @@ class SimplePie
                }
        }
 
-       function encode_instead_of_strip($enable = true)
+       public function encode_instead_of_strip($enable = true)
        {
                $this->sanitize->encode_instead_of_strip($enable);
        }
 
-       function strip_attributes($attribs = '')
+       public function strip_attributes($attribs = '')
        {
                if ($attribs === '')
                {
@@ -1427,12 +1179,34 @@ class SimplePie
                $this->sanitize->strip_attributes($attribs);
        }
 
-       function set_output_encoding($encoding = 'UTF-8')
+       /**
+        * Set the output encoding
+        *
+        * Allows you to override SimplePie's output to match that of your webpage.
+        * This is useful for times when your webpages are not being served as
+        * UTF-8.  This setting will be obeyed by {@see handle_content_type()}, and
+        * is similar to {@see set_input_encoding()}.
+        *
+        * It should be noted, however, that not all character encodings can support
+        * all characters.  If your page is being served as ISO-8859-1 and you try
+        * to display a Japanese feed, you'll likely see garbled characters.
+        * Because of this, it is highly recommended to ensure that your webpages
+        * are served as UTF-8.
+        *
+        * The number of supported character encodings depends on whether your web
+        * host supports {@link http://php.net/mbstring mbstring},
+        * {@link http://php.net/iconv iconv}, or both. See
+        * {@link http://simplepie.org/wiki/faq/Supported_Character_Encodings} for
+        * more information.
+        *
+        * @param string $encoding
+        */
+       public function set_output_encoding($encoding = 'UTF-8')
        {
                $this->sanitize->set_output_encoding($encoding);
        }
 
-       function strip_comments($strip = false)
+       public function strip_comments($strip = false)
        {
                $this->sanitize->strip_comments($strip);
        }
@@ -1441,68 +1215,59 @@ class SimplePie
         * Set element/attribute key/value pairs of HTML attributes
         * containing URLs that need to be resolved relative to the feed
         *
-        * @access public
+        * Defaults to |a|@href, |area|@href, |blockquote|@cite, |del|@cite,
+        * |form|@action, |img|@longdesc, |img|@src, |input|@src, |ins|@cite,
+        * |q|@cite
+        *
         * @since 1.0
-        * @param array $element_attribute Element/attribute key/value pairs
+        * @param array|null $element_attribute Element/attribute key/value pairs, null for default
         */
-       function set_url_replacements($element_attribute = array('a' => 'href', 'area' => 'href', 'blockquote' => 'cite', 'del' => 'cite', 'form' => 'action', 'img' => array('longdesc', 'src'), 'input' => 'src', 'ins' => 'cite', 'q' => 'cite'))
+       public function set_url_replacements($element_attribute = null)
        {
                $this->sanitize->set_url_replacements($element_attribute);
        }
 
        /**
-        * Set the handler to enable the display of cached favicons.
+        * Set the handler to enable the display of cached images.
         *
-        * @access public
-        * @param str $page Web-accessible path to the handler_favicon.php file.
+        * @param str $page Web-accessible path to the handler_image.php file.
         * @param str $qs The query string that the value should be passed to.
         */
-       function set_favicon_handler($page = false, $qs = 'i')
+       public function set_image_handler($page = false, $qs = 'i')
        {
                if ($page !== false)
                {
-                       $this->favicon_handler = $page . '?' . $qs . '=';
+                       $this->sanitize->set_image_handler($page . '?' . $qs . '=');
                }
                else
                {
-                       $this->favicon_handler = '';
+                       $this->image_handler = '';
                }
        }
 
        /**
-        * Set the handler to enable the display of cached images.
+        * Set the limit for items returned per-feed with multifeeds
         *
-        * @access public
-        * @param str $page Web-accessible path to the handler_image.php file.
-        * @param str $qs The query string that the value should be passed to.
+        * @param integer $limit The maximum number of items to return.
         */
-       function set_image_handler($page = false, $qs = 'i')
+       public function set_item_limit($limit = 0)
        {
-               if ($page !== false)
-               {
-                       $this->sanitize->set_image_handler($page . '?' . $qs . '=');
-               }
-               else
-               {
-                       $this->image_handler = '';
-               }
+               $this->item_limit = (int) $limit;
        }
 
        /**
-        * Set the limit for items returned per-feed with multifeeds.
+        * Initialize the feed object
         *
-        * @access public
-        * @param integer $limit The maximum number of items to return.
+        * This is what makes everything happen.  Period.  This is where all of the
+        * configuration options get processed, feeds are fetched, cached, and
+        * parsed, and all of that other good stuff.
+        *
+        * @return boolean True if successful, false otherwise
         */
-       function set_item_limit($limit = 0)
-       {
-               $this->item_limit = (int) $limit;
-       }
-
-       function init()
+       public function init()
        {
                // Check absolute bare minimum requirements.
-               if ((function_exists('version_compare') && version_compare(PHP_VERSION, '4.3.0', '<')) || !extension_loaded('xml') || !extension_loaded('pcre'))
+               if (!extension_loaded('xml') || !extension_loaded('pcre'))
                {
                        return false;
                }
@@ -1523,331 +1288,383 @@ class SimplePie
                        }
                }
 
-               if (isset($_GET[$this->javascript]))
+               if (method_exists($this->sanitize, 'set_registry'))
                {
-                       SimplePie_Misc::output_javascript();
-                       exit;
+                       $this->sanitize->set_registry($this->registry);
                }
 
                // Pass whatever was set with config options over to the sanitizer.
-               $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->cache_class);
-               $this->sanitize->pass_file_data($this->file_class, $this->timeout, $this->useragent, $this->force_fsockopen);
+               // Pass the classes in for legacy support; new classes should use the registry instead
+               $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->registry->get_class('Cache'));
+               $this->sanitize->pass_file_data($this->registry->get_class('File'), $this->timeout, $this->useragent, $this->force_fsockopen);
 
-               if ($this->feed_url !== null || $this->raw_data !== null)
+               if (!empty($this->multifeed_url))
                {
-                       $this->data = array();
+                       $i = 0;
+                       $success = 0;
                        $this->multifeed_objects = array();
-                       $cache = false;
-
-                       if ($this->feed_url !== null)
+                       $this->error = array();
+                       foreach ($this->multifeed_url as $url)
                        {
-                               $parsed_feed_url = SimplePie_Misc::parse_url($this->feed_url);
-                               // Decide whether to enable caching
-                               if ($this->cache && $parsed_feed_url['scheme'] !== '')
-                               {
-                                       $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc');
-                               }
-                               // If it's enabled and we don't want an XML dump, use the cache
-                               if ($cache && !$this->xml_dump)
-                               {
-                                       // Load the Cache
-                                       $this->data = $cache->load();
-                                       if (!empty($this->data))
-                                       {
-                                               // If the cache is for an outdated build of SimplePie
-                                               if (!isset($this->data['build']) || $this->data['build'] !== SIMPLEPIE_BUILD)
-                                               {
-                                                       $cache->unlink();
-                                                       $this->data = array();
-                                               }
-                                               // If we've hit a collision just rerun it with caching disabled
-                                               elseif (isset($this->data['url']) && $this->data['url'] !== $this->feed_url)
-                                               {
-                                                       $cache = false;
-                                                       $this->data = array();
-                                               }
-                                               // If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL.
-                                               elseif (isset($this->data['feed_url']))
-                                               {
-                                                       // If the autodiscovery cache is still valid use it.
-                                                       if ($cache->mtime() + $this->autodiscovery_cache_duration > time())
-                                                       {
-                                                               // Do not need to do feed autodiscovery yet.
-                                                               if ($this->data['feed_url'] === $this->data['url'])
-                                                               {
-                                                                       $cache->unlink();
-                                                                       $this->data = array();
-                                                               }
-                                                               else
-                                                               {
-                                                                       $this->set_feed_url($this->data['feed_url']);
-                                                                       return $this->init();
-                                                               }
-                                                       }
-                                               }
-                                               // Check if the cache has been updated
-                                               elseif ($cache->mtime() + $this->cache_duration < time())
-                                               {
-                                                       // If we have last-modified and/or etag set
-                                                       if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag']))
-                                                       {
-                                                               $headers = array();
-                                                               if (isset($this->data['headers']['last-modified']))
-                                                               {
-                                                                       $headers['if-modified-since'] = $this->data['headers']['last-modified'];
-                                                               }
-                                                               if (isset($this->data['headers']['etag']))
-                                                               {
-                                                                       $headers['if-none-match'] = '"' . $this->data['headers']['etag'] . '"';
-                                                               }
-                                                               $file =& new $this->file_class($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen);
-                                                               if ($file->success)
-                                                               {
-                                                                       if ($file->status_code === 304)
-                                                                       {
-                                                                               $cache->touch();
-                                                                               return true;
-                                                                       }
-                                                                       else
-                                                                       {
-                                                                               $headers = $file->headers;
-                                                                       }
-                                                               }
-                                                               else
-                                                               {
-                                                                       unset($file);
-                                                               }
-                                                       }
-                                               }
-                                               // If the cache is still valid, just return true
-                                               else
-                                               {
-                                                       return true;
-                                               }
-                                       }
-                                       // If the cache is empty, delete it
-                                       else
-                                       {
-                                               $cache->unlink();
-                                               $this->data = array();
-                                       }
-                               }
-                               // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it.
-                               if (!isset($file))
-                               {
-                                       if (is_a($this->file, 'SimplePie_File') && $this->file->url === $this->feed_url)
-                                       {
-                                               $file =& $this->file;
-                                       }
-                                       else
-                                       {
-                                               $file =& new $this->file_class($this->feed_url, $this->timeout, 5, null, $this->useragent, $this->force_fsockopen);
-                                       }
-                               }
-                               // If the file connection has an error, set SimplePie::error to that and quit
-                               if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))
+                               $this->multifeed_objects[$i] = clone $this;
+                               $this->multifeed_objects[$i]->set_feed_url($url);
+                               $single_success = $this->multifeed_objects[$i]->init();
+                               $success |= $single_success;
+                               if (!$single_success)
                                {
-                                       $this->error = $file->error;
-                                       if (!empty($this->data))
-                                       {
-                                               return true;
-                                       }
-                                       else
-                                       {
-                                               return false;
-                                       }
+                                       $this->error[$i] = $this->multifeed_objects[$i]->error();
                                }
+                               $i++;
+                       }
+                       return (bool) $success;
+               }
+               elseif ($this->feed_url === null && $this->raw_data === null)
+               {
+                       return false;
+               }
 
-                               if (!$this->force_feed)
-                               {
-                                       // Check if the supplied URL is a feed, if it isn't, look for it.
-                                       $locate =& new $this->locator_class($file, $this->timeout, $this->useragent, $this->file_class, $this->max_checked_feeds, $this->content_type_sniffer_class);
-                                       if (!$locate->is_feed($file))
-                                       {
-                                               // We need to unset this so that if SimplePie::set_file() has been called that object is untouched
-                                               unset($file);
-                                               if ($file = $locate->find($this->autodiscovery, $this->all_discovered_feeds))
-                                               {
-                                                       if ($cache)
-                                                       {
-                                                               $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD);
-                                                               if (!$cache->save($this))
-                                                               {
-                                                                       trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
-                                                               }
-                                                               $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc');
-                                                       }
-                                                       $this->feed_url = $file->url;
-                                               }
-                                               else
-                                               {
-                                                       $this->error = "A feed could not be found at $this->feed_url. A feed with an invalid mime type may fall victim to this error, or " . SIMPLEPIE_NAME . " was unable to auto-discover it.. Use force_feed() if you are certain this URL is a real feed.";
-                                                       SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
-                                                       return false;
-                                               }
-                                       }
-                                       $locate = null;
-                               }
+               $this->error = null;
+               $this->data = array();
+               $this->multifeed_objects = array();
+               $cache = false;
+
+               if ($this->feed_url !== null)
+               {
+                       $parsed_feed_url = $this->registry->call('Misc', 'parse_url', array($this->feed_url));
 
-                               $headers = $file->headers;
-                               $data = $file->body;
-                               $sniffer =& new $this->content_type_sniffer_class($file);
-                               $sniffed = $sniffer->get_type();
+                       // Decide whether to enable caching
+                       if ($this->cache && $parsed_feed_url['scheme'] !== '')
+                       {
+                               $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc'));
                        }
-                       else
+
+                       // Fetch the data via SimplePie_File into $this->raw_data
+                       if (($fetched = $this->fetch_data($cache)) === true)
                        {
-                               $data = $this->raw_data;
+                               return true;
                        }
+                       elseif ($fetched === false) {
+                               return false;
+                       }
+
+                       list($headers, $sniffed) = $fetched;
+               }
 
-                       // Set up array of possible encodings
-                       $encodings = array();
+               // Set up array of possible encodings
+               $encodings = array();
 
-                       // First check to see if input has been overridden.
-                       if ($this->input_encoding !== false)
+               // First check to see if input has been overridden.
+               if ($this->input_encoding !== false)
+               {
+                       $encodings[] = $this->input_encoding;
+               }
+
+               $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity');
+               $text_types = array('text/xml', 'text/xml-external-parsed-entity');
+
+               // RFC 3023 (only applies to sniffed content)
+               if (isset($sniffed))
+               {
+                       if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml')
+                       {
+                               if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
+                               {
+                                       $encodings[] = strtoupper($charset[1]);
+                               }
+                               $encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', array($this->raw_data, &$this->registry)));
+                               $encodings[] = 'UTF-8';
+                       }
+                       elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml')
+                       {
+                               if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
+                               {
+                                       $encodings[] = $charset[1];
+                               }
+                               $encodings[] = 'US-ASCII';
+                       }
+                       // Text MIME-type default
+                       elseif (substr($sniffed, 0, 5) === 'text/')
                        {
-                               $encodings[] = $this->input_encoding;
+                               $encodings[] = 'US-ASCII';
                        }
+               }
 
-                       $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity');
-                       $text_types = array('text/xml', 'text/xml-external-parsed-entity');
+               // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1
+               $encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', array($this->raw_data, &$this->registry)));
+               $encodings[] = 'UTF-8';
+               $encodings[] = 'ISO-8859-1';
 
-                       // RFC 3023 (only applies to sniffed content)
-                       if (isset($sniffed))
+               // There's no point in trying an encoding twice
+               $encodings = array_unique($encodings);
+
+               // Loop through each possible encoding, till we return something, or run out of possibilities
+               foreach ($encodings as $encoding)
+               {
+                       // Change the encoding to UTF-8 (as we always use UTF-8 internally)
+                       if ($utf8_data = $this->registry->call('Misc', 'change_encoding', array($this->raw_data, $encoding, 'UTF-8')))
                        {
-                               if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml')
+                               // Create new parser
+                               $parser = $this->registry->create('Parser');
+
+                               // If it's parsed fine
+                               if ($parser->parse($utf8_data, 'UTF-8'))
                                {
-                                       if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
+                                       $this->data = $parser->get_data();
+                                       if (!($this->get_type() & ~SIMPLEPIE_TYPE_NONE))
                                        {
-                                               $encodings[] = strtoupper($charset[1]);
+                                               $this->error = "A feed could not be found at $this->feed_url. This does not appear to be a valid RSS or Atom feed.";
+                                               $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__));
+                                               return false;
                                        }
-                                       $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data));
-                                       $encodings[] = 'UTF-8';
-                               }
-                               elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml')
-                               {
-                                       if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset))
+
+                                       if (isset($headers))
                                        {
-                                               $encodings[] = $charset[1];
+                                               $this->data['headers'] = $headers;
                                        }
-                                       $encodings[] = 'US-ASCII';
-                               }
-                               // Text MIME-type default
-                               elseif (substr($sniffed, 0, 5) === 'text/')
-                               {
-                                       $encodings[] = 'US-ASCII';
+                                       $this->data['build'] = SIMPLEPIE_BUILD;
+
+                                       // Cache the file if caching is enabled
+                                       if ($cache && !$cache->save($this))
+                                       {
+                                               trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
+                                       }
+                                       return true;
                                }
                        }
+               }
 
-                       // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1
-                       $encodings = array_merge($encodings, SimplePie_Misc::xml_encoding($data));
-                       $encodings[] = 'UTF-8';
-                       $encodings[] = 'ISO-8859-1';
+               if (isset($parser))
+               {
+                       // We have an error, just set SimplePie_Misc::error to it and quit
+                       $this->error = sprintf('This XML document is invalid, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column());
+               }
+               else
+               {
+                       $this->error = 'The data could not be converted to UTF-8. You MUST have either the iconv or mbstring extension installed. Upgrading to PHP 5.x (which includes iconv) is highly recommended.';
+               }
 
-                       // There's no point in trying an encoding twice
-                       $encodings = array_unique($encodings);
+               $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__));
 
-                       // If we want the XML, just output that with the most likely encoding and quit
-                       if ($this->xml_dump)
-                       {
-                               header('Content-type: text/xml; charset=' . $encodings[0]);
-                               echo $data;
-                               exit;
-                       }
+               return false;
+       }
 
-                       // Loop through each possible encoding, till we return something, or run out of possibilities
-                       foreach ($encodings as $encoding)
+       /**
+        * Fetch the data via SimplePie_File
+        *
+        * If the data is already cached, attempt to fetch it from there instead
+        * @param SimplePie_Cache|false $cache Cache handler, or false to not load from the cache
+        * @return array|true Returns true if the data was loaded from the cache, or an array of HTTP headers and sniffed type
+        */
+       protected function fetch_data(&$cache)
+       {
+               // If it's enabled, use the cache
+               if ($cache)
+               {
+                       // Load the Cache
+                       $this->data = $cache->load();
+                       if (!empty($this->data))
                        {
-                               // Change the encoding to UTF-8 (as we always use UTF-8 internally)
-                               if ($utf8_data = SimplePie_Misc::change_encoding($data, $encoding, 'UTF-8'))
+                               // If the cache is for an outdated build of SimplePie
+                               if (!isset($this->data['build']) || $this->data['build'] !== SIMPLEPIE_BUILD)
+                               {
+                                       $cache->unlink();
+                                       $this->data = array();
+                               }
+                               // If we've hit a collision just rerun it with caching disabled
+                               elseif (isset($this->data['url']) && $this->data['url'] !== $this->feed_url)
                                {
-                                       // Create new parser
-                                       $parser =& new $this->parser_class();
+                                       $cache = false;
+                                       $this->data = array();
+                               }
+                               // If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL.
+                               elseif (isset($this->data['feed_url']))
+                               {
+                                       // If the autodiscovery cache is still valid use it.
+                                       if ($cache->mtime() + $this->autodiscovery_cache_duration > time())
+                                       {
+                                               // Do not need to do feed autodiscovery yet.
+                                               if ($this->data['feed_url'] !== $this->data['url'])
+                                               {
+                                                       $this->set_feed_url($this->data['feed_url']);
+                                                       return $this->init();
+                                               }
 
-                                       // If it's parsed fine
-                                       if ($parser->parse($utf8_data, 'UTF-8'))
+                                               $cache->unlink();
+                                               $this->data = array();
+                                       }
+                               }
+                               // Check if the cache has been updated
+                               elseif ($cache->mtime() + $this->cache_duration < time())
+                               {
+                                       // If we have last-modified and/or etag set
+                                       if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag']))
                                        {
-                                               $this->data = $parser->get_data();
-                                               if ($this->get_type() & ~SIMPLEPIE_TYPE_NONE)
+                                               $headers = array(
+                                                       'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
+                                               );
+                                               if (isset($this->data['headers']['last-modified']))
                                                {
-                                                       if (isset($headers))
-                                                       {
-                                                               $this->data['headers'] = $headers;
-                                                       }
-                                                       $this->data['build'] = SIMPLEPIE_BUILD;
+                                                       $headers['if-modified-since'] = $this->data['headers']['last-modified'];
+                                               }
+                                               if (isset($this->data['headers']['etag']))
+                                               {
+                                                       $headers['if-none-match'] = $this->data['headers']['etag'];
+                                               }
+
+                                               $file = $this->registry->create('File', array($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen));
 
-                                                       // Cache the file if caching is enabled
-                                                       if ($cache && !$cache->save($this))
+                                               if ($file->success)
+                                               {
+                                                       if ($file->status_code === 304)
                                                        {
-                                                               trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
+                                                               $cache->touch();
+                                                               return true;
                                                        }
-                                                       return true;
                                                }
                                                else
                                                {
-                                                       $this->error = "A feed could not be found at $this->feed_url. This does not appear to be a valid RSS or Atom feed.";
-                                                       SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
-                                                       return false;
+                                                       unset($file);
                                                }
                                        }
                                }
+                               // If the cache is still valid, just return true
+                               else
+                               {
+                                       $this->raw_data = false;
+                                       return true;
+                               }
+                       }
+                       // If the cache is empty, delete it
+                       else
+                       {
+                               $cache->unlink();
+                               $this->data = array();
                        }
-                       if (isset($parser))
+               }
+               // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it.
+               if (!isset($file))
+               {
+                       if ($this->file instanceof SimplePie_File && $this->file->url === $this->feed_url)
                        {
-                               // We have an error, just set SimplePie_Misc::error to it and quit
-                               $this->error = sprintf('This XML document is invalid, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column());
+                               $file =& $this->file;
                        }
                        else
                        {
-                               $this->error = 'The data could not be converted to UTF-8. You MUST have either the iconv or mbstring extension installed. Upgrading to PHP 5.x (which includes iconv) is highly recommended.';
+                               $headers = array(
+                                       'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1',
+                               );
+                               $file = $this->registry->create('File', array($this->feed_url, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen));
                        }
-                       SimplePie_Misc::error($this->error, E_USER_NOTICE, __FILE__, __LINE__);
-                       return false;
                }
-               elseif (!empty($this->multifeed_url))
+               // If the file connection has an error, set SimplePie::error to that and quit
+               if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))
                {
-                       $i = 0;
-                       $success = 0;
-                       $this->multifeed_objects = array();
-                       foreach ($this->multifeed_url as $url)
+                       $this->error = $file->error;
+                       return !empty($this->data);
+               }
+
+               if (!$this->force_feed)
+               {
+                       // Check if the supplied URL is a feed, if it isn't, look for it.
+                       $locate = $this->registry->create('Locator', array(&$file, $this->timeout, $this->useragent, $this->max_checked_feeds));
+
+                       if (!$locate->is_feed($file))
                        {
-                               if (SIMPLEPIE_PHP5)
+                               // We need to unset this so that if SimplePie::set_file() has been called that object is untouched
+                               unset($file);
+                               try
                                {
-                                       // This keyword needs to defy coding standards for PHP4 compatibility
-                                       $this->multifeed_objects[$i] = clone($this);
+                                       if (!($file = $locate->find($this->autodiscovery, $this->all_discovered_feeds)))
+                                       {
+                                               $this->error = "A feed could not be found at $this->feed_url. A feed with an invalid mime type may fall victim to this error, or " . SIMPLEPIE_NAME . " was unable to auto-discover it.. Use force_feed() if you are certain this URL is a real feed.";
+                                               $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__));
+                                               return false;
+                                       }
                                }
-                               else
+                               catch (SimplePie_Exception $e)
                                {
-                                       $this->multifeed_objects[$i] = $this;
+                                       // This is usually because DOMDocument doesn't exist
+                                       $this->error = $e->getMessage();
+                                       $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, $e->getFile(), $e->getLine()));
+                                       return false;
                                }
-                               $this->multifeed_objects[$i]->set_feed_url($url);
-                               $success |= $this->multifeed_objects[$i]->init();
-                               $i++;
+                               if ($cache)
+                               {
+                                       $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD);
+                                       if (!$cache->save($this))
+                                       {
+                                               trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
+                                       }
+                                       $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc'));
+                               }
+                               $this->feed_url = $file->url;
                        }
-                       return (bool) $success;
-               }
-               else
-               {
-                       return false;
+                       $locate = null;
                }
+
+               $this->raw_data = $file->body;
+
+               $headers = $file->headers;
+               $sniffer = $this->registry->create('Content_Type_Sniffer', array(&$file));
+               $sniffed = $sniffer->get_type();
+
+               return array($headers, $sniffed);
        }
 
        /**
-        * Return the error message for the occured error
+        * Get the error message for the occured error
         *
-        * @access public
-        * @return string Error message
+        * @return string|array Error message, or array of messages for multifeeds
         */
-       function error()
+       public function error()
        {
                return $this->error;
        }
 
-       function get_encoding()
+       /**
+        * Get the raw XML
+        *
+        * This is the same as the old `$feed->enable_xml_dump(true)`, but returns
+        * the data instead of printing it.
+        *
+        * @return string|boolean Raw XML data, false if the cache is used
+        */
+       public function get_raw_data()
+       {
+               return $this->raw_data;
+       }
+
+       /**
+        * Get the character encoding used for output
+        *
+        * @since Preview Release
+        * @return string
+        */
+       public function get_encoding()
        {
                return $this->sanitize->output_encoding;
        }
 
-       function handle_content_type($mime = 'text/html')
+       /**
+        * Send the content-type header with correct encoding
+        *
+        * This method ensures that the SimplePie-enabled page is being served with
+        * the correct {@link http://www.iana.org/assignments/media-types/ mime-type}
+        * and character encoding HTTP headers (character encoding determined by the
+        * {@see set_output_encoding} config option).
+        *
+        * This won't work properly if any content or whitespace has already been
+        * sent to the browser, because it relies on PHP's
+        * {@link http://php.net/header header()} function, and these are the
+        * circumstances under which the function works.
+        *
+        * Because it's setting these settings for the entire page (as is the nature
+        * of HTTP headers), this should only be used once per page (again, at the
+        * top).
+        *
+        * @param string $mime MIME type to serve the page as
+        */
+       public function handle_content_type($mime = 'text/html')
        {
                if (!headers_sent())
                {
@@ -1864,7 +1681,33 @@ class SimplePie
                }
        }
 
-       function get_type()
+       /**
+        * Get the type of the feed
+        *
+        * This returns a SIMPLEPIE_TYPE_* constant, which can be tested against
+        * using {@link http://php.net/language.operators.bitwise bitwise operators}
+        *
+        * @since 0.8 (usage changed to using constants in 1.0)
+        * @see SIMPLEPIE_TYPE_NONE Unknown.
+        * @see SIMPLEPIE_TYPE_RSS_090 RSS 0.90.
+        * @see SIMPLEPIE_TYPE_RSS_091_NETSCAPE RSS 0.91 (Netscape).
+        * @see SIMPLEPIE_TYPE_RSS_091_USERLAND RSS 0.91 (Userland).
+        * @see SIMPLEPIE_TYPE_RSS_091 RSS 0.91.
+        * @see SIMPLEPIE_TYPE_RSS_092 RSS 0.92.
+        * @see SIMPLEPIE_TYPE_RSS_093 RSS 0.93.
+        * @see SIMPLEPIE_TYPE_RSS_094 RSS 0.94.
+        * @see SIMPLEPIE_TYPE_RSS_10 RSS 1.0.
+        * @see SIMPLEPIE_TYPE_RSS_20 RSS 2.0.x.
+        * @see SIMPLEPIE_TYPE_RSS_RDF RDF-based RSS.
+        * @see SIMPLEPIE_TYPE_RSS_SYNDICATION Non-RDF-based RSS (truly intended as syndication format).
+        * @see SIMPLEPIE_TYPE_RSS_ALL Any version of RSS.
+        * @see SIMPLEPIE_TYPE_ATOM_03 Atom 0.3.
+        * @see SIMPLEPIE_TYPE_ATOM_10 Atom 1.0.
+        * @see SIMPLEPIE_TYPE_ATOM_ALL Any version of Atom.
+        * @see SIMPLEPIE_TYPE_ALL Any known/supported feed type.
+        * @return int SIMPLEPIE_TYPE_* constant
+        */
+       public function get_type()
        {
                if (!isset($this->data['type']))
                {
@@ -1945,238 +1788,66 @@ class SimplePie
        }
 
        /**
-        * Returns the URL for the favicon of the feed's website.
+        * Get the URL for the feed
         *
-        * @todo Cache atom:icon
-        * @access public
-        * @since 1.0
+        * May or may not be different from the URL passed to {@see set_feed_url()},
+        * depending on whether auto-discovery was used.
+        *
+        * @since Preview Release (previously called `get_feed_url()` since SimplePie 0.8.)
+        * @todo If we have a perm redirect we should return the new URL
+        * @todo When we make the above change, let's support <itunes:new-feed-url> as well
+        * @todo Also, |atom:link|@rel=self
+        * @return string|null
         */
-       function get_favicon()
+       public function subscribe_url()
        {
-               if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon'))
+               if ($this->feed_url !== null)
                {
-                       return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0]));
+                       return $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI);
                }
-               elseif (($url = $this->get_link()) !== null && preg_match('/^http(s)?:\/\//i', $url))
+               else
                {
-                       $favicon = SimplePie_Misc::absolutize_url('/favicon.ico', $url);
+                       return null;
+               }
+       }
 
-                       if ($this->cache && $this->favicon_handler)
-                       {
-                               $favicon_filename = call_user_func($this->cache_name_function, $favicon);
-                               $cache = call_user_func(array($this->cache_class, 'create'), $this->cache_location, $favicon_filename, 'spi');
-
-                               if ($cache->load())
-                               {
-                                       return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI);
-                               }
-                               else
-                               {
-                                       $file =& new $this->file_class($favicon, $this->timeout / 10, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen);
-
-                                       if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)) && strlen($file->body) > 0)
-                                       {
-                                               $sniffer =& new $this->content_type_sniffer_class($file);
-                                               if (substr($sniffer->get_type(), 0, 6) === 'image/')
-                                               {
-                                                       if ($cache->save(array('headers' => $file->headers, 'body' => $file->body)))
-                                                       {
-                                                               return $this->sanitize($this->favicon_handler . $favicon_filename, SIMPLEPIE_CONSTRUCT_IRI);
-                                                       }
-                                                       else
-                                                       {
-                                                               trigger_error("$cache->name is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING);
-                                                               return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI);
-                                                       }
-                                               }
-                                               // not an image
-                                               else
-                                               {
-                                                       return false;
-                                               }
-                                       }
-                               }
-                       }
-                       else
-                       {
-                               return $this->sanitize($favicon, SIMPLEPIE_CONSTRUCT_IRI);
-                       }
-               }
-               return false;
-       }
-
-       /**
-        * @todo If we have a perm redirect we should return the new URL
-        * @todo When we make the above change, let's support <itunes:new-feed-url> as well
-        * @todo Also, |atom:link|@rel=self
-        */
-       function subscribe_url()
-       {
-               if ($this->feed_url !== null)
-               {
-                       return $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI);
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function subscribe_feed()
-       {
-               if ($this->feed_url !== null)
-               {
-                       return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI);
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function subscribe_outlook()
-       {
-               if ($this->feed_url !== null)
-               {
-                       return $this->sanitize('outlook' . SimplePie_Misc::fix_protocol($this->feed_url, 2), SIMPLEPIE_CONSTRUCT_IRI);
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function subscribe_podcast()
-       {
-               if ($this->feed_url !== null)
-               {
-                       return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 3), SIMPLEPIE_CONSTRUCT_IRI);
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function subscribe_itunes()
-       {
-               if ($this->feed_url !== null)
-               {
-                       return $this->sanitize(SimplePie_Misc::fix_protocol($this->feed_url, 4), SIMPLEPIE_CONSTRUCT_IRI);
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       /**
-        * Creates the subscribe_* methods' return data
-        *
-        * @access private
-        * @param string $feed_url String to prefix to the feed URL
-        * @param string $site_url String to prefix to the site URL (and
-        * suffix to the feed URL)
-        * @return mixed URL if feed exists, false otherwise
-        */
-       function subscribe_service($feed_url, $site_url = null)
-       {
-               if ($this->subscribe_url())
-               {
-                       $return = $feed_url . rawurlencode($this->feed_url);
-                       if ($site_url !== null && $this->get_link() !== null)
-                       {
-                               $return .= $site_url . rawurlencode($this->get_link());
-                       }
-                       return $this->sanitize($return, SIMPLEPIE_CONSTRUCT_IRI);
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function subscribe_aol()
-       {
-               return $this->subscribe_service('http://feeds.my.aol.com/add.jsp?url=');
-       }
-
-       function subscribe_bloglines()
-       {
-               return $this->subscribe_service('http://www.bloglines.com/sub/');
-       }
-
-       function subscribe_eskobo()
-       {
-               return $this->subscribe_service('http://www.eskobo.com/?AddToMyPage=');
-       }
-
-       function subscribe_feedfeeds()
-       {
-               return $this->subscribe_service('http://www.feedfeeds.com/add?feed=');
-       }
-
-       function subscribe_feedster()
-       {
-               return $this->subscribe_service('http://www.feedster.com/myfeedster.php?action=addrss&confirm=no&rssurl=');
-       }
-
-       function subscribe_google()
-       {
-               return $this->subscribe_service('http://fusion.google.com/add?feedurl=');
-       }
-
-       function subscribe_gritwire()
-       {
-               return $this->subscribe_service('http://my.gritwire.com/feeds/addExternalFeed.aspx?FeedUrl=');
-       }
-
-       function subscribe_msn()
-       {
-               return $this->subscribe_service('http://my.msn.com/addtomymsn.armx?id=rss&ut=', '&ru=');
-       }
-
-       function subscribe_netvibes()
-       {
-               return $this->subscribe_service('http://www.netvibes.com/subscribe.php?url=');
-       }
-
-       function subscribe_newsburst()
-       {
-               return $this->subscribe_service('http://www.newsburst.com/Source/?add=');
-       }
-
-       function subscribe_newsgator()
-       {
-               return $this->subscribe_service('http://www.newsgator.com/ngs/subscriber/subext.aspx?url=');
-       }
-
-       function subscribe_odeo()
-       {
-               return $this->subscribe_service('http://www.odeo.com/listen/subscribe?feed=');
-       }
-
-       function subscribe_podnova()
-       {
-               return $this->subscribe_service('http://www.podnova.com/index_your_podcasts.srf?action=add&url=');
-       }
-
-       function subscribe_rojo()
-       {
-               return $this->subscribe_service('http://www.rojo.com/add-subscription?resource=');
-       }
-
-       function subscribe_yahoo()
-       {
-               return $this->subscribe_service('http://add.my.yahoo.com/rss?url=');
-       }
-
-       function get_feed_tags($namespace, $tag)
-       {
-               $type = $this->get_type();
-               if ($type & SIMPLEPIE_TYPE_ATOM_10)
-               {
-                       if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]))
+       /**
+        * Get data for an feed-level element
+        *
+        * This method allows you to get access to ANY element/attribute that is a
+        * sub-element of the opening feed tag.
+        *
+        * The return value is an indexed array of elements matching the given
+        * namespace and tag name. Each element has `attribs`, `data` and `child`
+        * subkeys. For `attribs` and `child`, these contain namespace subkeys.
+        * `attribs` then has one level of associative name => value data (where
+        * `value` is a string) after the namespace. `child` has tag-indexed keys
+        * after the namespace, each member of which is an indexed array matching
+        * this same format.
+        *
+        * For example:
+        * <pre>
+        * // This is probably a bad example because we already support
+        * // <media:content> natively, but it shows you how to parse through
+        * // the nodes.
+        * $group = $item->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group');
+        * $content = $group[0]['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'];
+        * $file = $content[0]['attribs']['']['url'];
+        * echo $file;
+        * </pre>
+        *
+        * @since 1.0
+        * @see http://simplepie.org/wiki/faq/supported_xml_namespaces
+        * @param string $namespace The URL of the XML namespace of the elements you're trying to access
+        * @param string $tag Tag name
+        * @return array
+        */
+       public function get_feed_tags($namespace, $tag)
+       {
+               $type = $this->get_type();
+               if ($type & SIMPLEPIE_TYPE_ATOM_10)
+               {
+                       if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]))
                        {
                                return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag];
                        }
@@ -2205,7 +1876,21 @@ class SimplePie
                return null;
        }
 
-       function get_channel_tags($namespace, $tag)
+       /**
+        * Get data for an channel-level element
+        *
+        * This method allows you to get access to ANY element/attribute in the
+        * channel/header section of the feed.
+        *
+        * See {@see SimplePie::get_feed_tags()} for a description of the return value
+        *
+        * @since 1.0
+        * @see http://simplepie.org/wiki/faq/supported_xml_namespaces
+        * @param string $namespace The URL of the XML namespace of the elements you're trying to access
+        * @param string $tag Tag name
+        * @return array
+        */
+       public function get_channel_tags($namespace, $tag)
        {
                $type = $this->get_type();
                if ($type & SIMPLEPIE_TYPE_ATOM_ALL)
@@ -2248,7 +1933,21 @@ class SimplePie
                return null;
        }
 
-       function get_image_tags($namespace, $tag)
+       /**
+        * Get data for an channel-level element
+        *
+        * This method allows you to get access to ANY element/attribute in the
+        * image/logo section of the feed.
+        *
+        * See {@see SimplePie::get_feed_tags()} for a description of the return value
+        *
+        * @since 1.0
+        * @see http://simplepie.org/wiki/faq/supported_xml_namespaces
+        * @param string $namespace The URL of the XML namespace of the elements you're trying to access
+        * @param string $tag Tag name
+        * @return array
+        */
+       public function get_image_tags($namespace, $tag)
        {
                $type = $this->get_type();
                if ($type & SIMPLEPIE_TYPE_RSS_10)
@@ -2284,7 +1983,19 @@ class SimplePie
                return null;
        }
 
-       function get_base($element = array())
+       /**
+        * Get the base URL value from the feed
+        *
+        * Uses `<xml:base>` if available, otherwise uses the first link in the
+        * feed, or failing that, the URL of the feed itself.
+        *
+        * @see get_link
+        * @see subscribe_url
+        *
+        * @param array $element
+        * @return string
+        */
+       public function get_base($element = array())
        {
                if (!($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION) && !empty($element['xml_base_explicit']) && isset($element['xml_base']))
                {
@@ -2300,20 +2011,38 @@ class SimplePie
                }
        }
 
-       function sanitize($data, $type, $base = '')
+       /**
+        * Sanitize feed data
+        *
+        * @access private
+        * @see SimplePie_Sanitize::sanitize()
+        * @param string $data Data to sanitize
+        * @param int $type One of the SIMPLEPIE_CONSTRUCT_* constants
+        * @param string $base Base URL to resolve URLs against
+        * @return string Sanitized data
+        */
+       public function sanitize($data, $type, $base = '')
        {
                return $this->sanitize->sanitize($data, $type, $base);
        }
 
-       function get_title()
+       /**
+        * Get the title of the feed
+        *
+        * Uses `<atom:title>`, `<title>` or `<dc:title>`
+        *
+        * @since 1.0 (previously called `get_feed_title` since 0.8)
+        * @return string|null
+        */
+       public function get_title()
        {
                if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
                {
-                       return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+                       return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
                }
                elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
                {
-                       return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+                       return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
                }
                elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
                {
@@ -2341,7 +2070,14 @@ class SimplePie
                }
        }
 
-       function get_category($key = 0)
+       /**
+        * Get a category for the feed
+        *
+        * @since Unknown
+        * @param int $key The category that you want to return.  Remember that arrays begin with 0, not 1
+        * @return SimplePie_Category|null
+        */
+       public function get_category($key = 0)
        {
                $categories = $this->get_categories();
                if (isset($categories[$key]))
@@ -2354,7 +2090,15 @@ class SimplePie
                }
        }
 
-       function get_categories()
+       /**
+        * Get all categories for the feed
+        *
+        * Uses `<atom:category>`, `<category>` or `<dc:subject>`
+        *
+        * @since Unknown
+        * @return array|null List of {@see SimplePie_Category} objects
+        */
+       public function get_categories()
        {
                $categories = array();
 
@@ -2375,7 +2119,7 @@ class SimplePie
                        {
                                $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
                        }
-                       $categories[] =& new $this->category_class($term, $scheme, $label);
+                       $categories[] = $this->registry->create('Category', array($term, $scheme, $label));
                }
                foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
                {
@@ -2390,20 +2134,20 @@ class SimplePie
                        {
                                $scheme = null;
                        }
-                       $categories[] =& new $this->category_class($term, $scheme, null);
+                       $categories[] = $this->registry->create('Category', array($term, $scheme, null));
                }
                foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
                {
-                       $categories[] =& new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+                       $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
                }
                foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
                {
-                       $categories[] =& new $this->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+                       $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
                }
 
                if (!empty($categories))
                {
-                       return SimplePie_Misc::array_unique($categories);
+                       return array_unique($categories);
                }
                else
                {
@@ -2411,7 +2155,14 @@ class SimplePie
                }
        }
 
-       function get_author($key = 0)
+       /**
+        * Get an author for the feed
+        *
+        * @since 1.1
+        * @param int $key The author that you want to return.  Remember that arrays begin with 0, not 1
+        * @return SimplePie_Author|null
+        */
+       public function get_author($key = 0)
        {
                $authors = $this->get_authors();
                if (isset($authors[$key]))
@@ -2424,7 +2175,15 @@ class SimplePie
                }
        }
 
-       function get_authors()
+       /**
+        * Get all authors for the feed
+        *
+        * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>`
+        *
+        * @since 1.1
+        * @return array|null List of {@see SimplePie_Author} objects
+        */
+       public function get_authors()
        {
                $authors = array();
                foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
@@ -2446,7 +2205,7 @@ class SimplePie
                        }
                        if ($name !== null || $email !== null || $uri !== null)
                        {
-                               $authors[] =& new $this->author_class($name, $uri, $email);
+                               $authors[] = $this->registry->create('Author', array($name, $uri, $email));
                        }
                }
                if ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
@@ -2468,25 +2227,25 @@ class SimplePie
                        }
                        if ($name !== null || $email !== null || $url !== null)
                        {
-                               $authors[] =& new $this->author_class($name, $url, $email);
+                               $authors[] = $this->registry->create('Author', array($name, $url, $email));
                        }
                }
                foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
                {
-                       $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+                       $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
                }
                foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
                {
-                       $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+                       $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
                }
                foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
                {
-                       $authors[] =& new $this->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
+                       $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null));
                }
 
                if (!empty($authors))
                {
-                       return SimplePie_Misc::array_unique($authors);
+                       return array_unique($authors);
                }
                else
                {
@@ -2494,7 +2253,14 @@ class SimplePie
                }
        }
 
-       function get_contributor($key = 0)
+       /**
+        * Get a contributor for the feed
+        *
+        * @since 1.1
+        * @param int $key The contrbutor that you want to return.  Remember that arrays begin with 0, not 1
+        * @return SimplePie_Author|null
+        */
+       public function get_contributor($key = 0)
        {
                $contributors = $this->get_contributors();
                if (isset($contributors[$key]))
@@ -2507,7 +2273,15 @@ class SimplePie
                }
        }
 
-       function get_contributors()
+       /**
+        * Get all contributors for the feed
+        *
+        * Uses `<atom:contributor>`
+        *
+        * @since 1.1
+        * @return array|null List of {@see SimplePie_Author} objects
+        */
+       public function get_contributors()
        {
                $contributors = array();
                foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
@@ -2529,7 +2303,7 @@ class SimplePie
                        }
                        if ($name !== null || $email !== null || $uri !== null)
                        {
-                               $contributors[] =& new $this->author_class($name, $uri, $email);
+                               $contributors[] = $this->registry->create('Author', array($name, $uri, $email));
                        }
                }
                foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
@@ -2551,13 +2325,13 @@ class SimplePie
                        }
                        if ($name !== null || $email !== null || $url !== null)
                        {
-                               $contributors[] =& new $this->author_class($name, $url, $email);
+                               $contributors[] = $this->registry->create('Author', array($name, $url, $email));
                        }
                }
 
                if (!empty($contributors))
                {
-                       return SimplePie_Misc::array_unique($contributors);
+                       return array_unique($contributors);
                }
                else
                {
@@ -2565,7 +2339,15 @@ class SimplePie
                }
        }
 
-       function get_link($key = 0, $rel = 'alternate')
+       /**
+        * Get a single link for the feed
+        *
+        * @since 1.0 (previously called `get_feed_link` since Preview Release, `get_feed_permalink()` since 0.8)
+        * @param int $key The link that you want to return.  Remember that arrays begin with 0, not 1
+        * @param string $rel The relationship of the link to return
+        * @return string|null Link URL
+        */
+       public function get_link($key = 0, $rel = 'alternate')
        {
                $links = $this->get_links($rel);
                if (isset($links[$key]))
@@ -2579,14 +2361,31 @@ class SimplePie
        }
 
        /**
-        * Added for parity between the parent-level and the item/entry-level.
+        * Get the permalink for the item
+        *
+        * Returns the first link available with a relationship of "alternate".
+        * Identical to {@see get_link()} with key 0
+        *
+        * @see get_link
+        * @since 1.0 (previously called `get_feed_link` since Preview Release, `get_feed_permalink()` since 0.8)
+        * @internal Added for parity between the parent-level and the item/entry-level.
+        * @return string|null Link URL
         */
-       function get_permalink()
+       public function get_permalink()
        {
                return $this->get_link(0);
        }
 
-       function get_links($rel = 'alternate')
+       /**
+        * Get all links for the feed
+        *
+        * Uses `<atom:link>` or `<link>`
+        *
+        * @since Beta 2
+        * @param string $rel The relationship of links to return
+        * @return array|null Links found for the feed (strings)
+        */
+       public function get_links($rel = 'alternate')
        {
                if (!isset($this->data['links']))
                {
@@ -2630,7 +2429,7 @@ class SimplePie
                        $keys = array_keys($this->data['links']);
                        foreach ($keys as $key)
                        {
-                               if (SimplePie_Misc::is_isegment_nz_nc($key))
+                               if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key)))
                                {
                                        if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
                                        {
@@ -2660,20 +2459,29 @@ class SimplePie
                }
        }
 
-       function get_all_discovered_feeds()
+       public function get_all_discovered_feeds()
        {
                return $this->all_discovered_feeds;
        }
 
-       function get_description()
+       /**
+        * Get the content for the item
+        *
+        * Uses `<atom:subtitle>`, `<atom:tagline>`, `<description>`,
+        * `<dc:description>`, `<itunes:summary>` or `<itunes:subtitle>`
+        *
+        * @since 1.0 (previously called `get_feed_description()` since 0.8)
+        * @return string|null
+        */
+       public function get_description()
        {
                if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle'))
                {
-                       return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+                       return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
                }
                elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline'))
                {
-                       return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+                       return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
                }
                elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
                {
@@ -2709,15 +2517,23 @@ class SimplePie
                }
        }
 
-       function get_copyright()
+       /**
+        * Get the copyright info for the feed
+        *
+        * Uses `<atom:rights>`, `<atom:copyright>` or `<dc:rights>`
+        *
+        * @since 1.0 (previously called `get_feed_copyright()` since 0.8)
+        * @return string|null
+        */
+       public function get_copyright()
        {
                if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
                {
-                       return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+                       return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
                }
                elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright'))
                {
-                       return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
+                       return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0]));
                }
                elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright'))
                {
@@ -2737,7 +2553,15 @@ class SimplePie
                }
        }
 
-       function get_language()
+       /**
+        * Get the language for the feed
+        *
+        * Uses `<language>`, `<dc:language>`, or @xml_lang
+        *
+        * @since 1.0 (previously called `get_feed_language()` since 0.8)
+        * @return string|null
+        */
+       public function get_language()
        {
                if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language'))
                {
@@ -2773,7 +2597,19 @@ class SimplePie
                }
        }
 
-       function get_latitude()
+       /**
+        * Get the latitude coordinates for the item
+        *
+        * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications
+        *
+        * Uses `<geo:lat>` or `<georss:point>`
+        *
+        * @since 1.0
+        * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo
+        * @link http://www.georss.org/ GeoRSS
+        * @return string|null
+        */
+       public function get_latitude()
        {
 
                if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat'))
@@ -2790,7 +2626,19 @@ class SimplePie
                }
        }
 
-       function get_longitude()
+       /**
+        * Get the longitude coordinates for the feed
+        *
+        * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications
+        *
+        * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>`
+        *
+        * @since 1.0
+        * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo
+        * @link http://www.georss.org/ GeoRSS
+        * @return string|null
+        */
+       public function get_longitude()
        {
                if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long'))
                {
@@ -2810,7 +2658,16 @@ class SimplePie
                }
        }
 
-       function get_image_title()
+       /**
+        * Get the feed logo's title
+        *
+        * RSS 0.9.0, 1.0 and 2.0 feeds are allowed to have a "feed logo" title.
+        *
+        * Uses `<image><title>` or `<image><dc:title>`
+        *
+        * @return string|null
+        */
+       public function get_image_title()
        {
                if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
                {
@@ -2838,7 +2695,18 @@ class SimplePie
                }
        }
 
-       function get_image_url()
+       /**
+        * Get the feed logo's URL
+        *
+        * RSS 0.9.0, 2.0, Atom 1.0, and feeds with iTunes RSS tags are allowed to
+        * have a "feed logo" URL. This points directly to the image itself.
+        *
+        * Uses `<itunes:image>`, `<atom:logo>`, `<atom:icon>`,
+        * `<image><title>` or `<image><dc:title>`
+        *
+        * @return string|null
+        */
+       public function get_image_url()
        {
                if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image'))
                {
@@ -2870,7 +2738,19 @@ class SimplePie
                }
        }
 
-       function get_image_link()
+
+       /**
+        * Get the feed logo's link
+        *
+        * RSS 0.9.0, 1.0 and 2.0 feeds are allowed to have a "feed logo" link. This
+        * points to a human-readable page that the image should link to.
+        *
+        * Uses `<itunes:image>`, `<atom:logo>`, `<atom:icon>`,
+        * `<image><title>` or `<image><dc:title>`
+        *
+        * @return string|null
+        */
+       public function get_image_link()
        {
                if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
                {
@@ -2890,7 +2770,17 @@ class SimplePie
                }
        }
 
-       function get_image_width()
+       /**
+        * Get the feed logo's link
+        *
+        * RSS 2.0 feeds are allowed to have a "feed logo" width.
+        *
+        * Uses `<image><width>` or defaults to 88.0 if no width is specified and
+        * the feed is an RSS 2.0 feed.
+        *
+        * @return int|float|null
+        */
+       public function get_image_width()
        {
                if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'width'))
                {
@@ -2906,7 +2796,17 @@ class SimplePie
                }
        }
 
-       function get_image_height()
+       /**
+        * Get the feed logo's height
+        *
+        * RSS 2.0 feeds are allowed to have a "feed logo" height.
+        *
+        * Uses `<image><height>` or defaults to 31.0 if no height is specified and
+        * the feed is an RSS 2.0 feed.
+        *
+        * @return int|float|null
+        */
+       public function get_image_height()
        {
                if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'height'))
                {
@@ -2922,7 +2822,16 @@ class SimplePie
                }
        }
 
-       function get_item_quantity($max = 0)
+       /**
+        * Get the number of items in the feed
+        *
+        * This is well-suited for {@link http://php.net/for for()} loops with
+        * {@see get_item()}
+        *
+        * @param int $max Maximum value to return. 0 for no limit
+        * @return int Number of items in the feed
+        */
+       public function get_item_quantity($max = 0)
        {
                $max = (int) $max;
                $qty = count($this->get_items());
@@ -2936,7 +2845,19 @@ class SimplePie
                }
        }
 
-       function get_item($key = 0)
+       /**
+        * Get a single item from the feed
+        *
+        * This is better suited for {@link http://php.net/for for()} loops, whereas
+        * {@see get_items()} is better suited for
+        * {@link http://php.net/foreach foreach()} loops.
+        *
+        * @see get_item_quantity()
+        * @since Beta 2
+        * @param int $key The item that you want to return.  Remember that arrays begin with 0, not 1
+        * @return SimplePie_Item|null
+        */
+       public function get_item($key = 0)
        {
                $items = $this->get_items();
                if (isset($items[$key]))
@@ -2949,7 +2870,20 @@ class SimplePie
                }
        }
 
-       function get_items($start = 0, $end = 0)
+       /**
+        * Get all items from the feed
+        *
+        * This is better suited for {@link http://php.net/for for()} loops, whereas
+        * {@see get_items()} is better suited for
+        * {@link http://php.net/foreach foreach()} loops.
+        *
+        * @see get_item_quantity
+        * @since Beta 2
+        * @param int $start Index to start at
+        * @param int $end Number of items to return. 0 for all items after `$start`
+        * @return array|null List of {@see SimplePie_Item} objects
+        */
+       public function get_items($start = 0, $end = 0)
        {
                if (!isset($this->data['items']))
                {
@@ -2965,7 +2899,7 @@ class SimplePie
                                        $keys = array_keys($items);
                                        foreach ($keys as $key)
                                        {
-                                               $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+                                               $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
                                        }
                                }
                                if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry'))
@@ -2973,7 +2907,7 @@ class SimplePie
                                        $keys = array_keys($items);
                                        foreach ($keys as $key)
                                        {
-                                               $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+                                               $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
                                        }
                                }
                                if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item'))
@@ -2981,7 +2915,7 @@ class SimplePie
                                        $keys = array_keys($items);
                                        foreach ($keys as $key)
                                        {
-                                               $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+                                               $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
                                        }
                                }
                                if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item'))
@@ -2989,7 +2923,7 @@ class SimplePie
                                        $keys = array_keys($items);
                                        foreach ($keys as $key)
                                        {
-                                               $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+                                               $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
                                        }
                                }
                                if ($items = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'item'))
@@ -2997,7 +2931,7 @@ class SimplePie
                                        $keys = array_keys($items);
                                        foreach ($keys as $key)
                                        {
-                                               $this->data['items'][] =& new $this->item_class($this, $items[$key]);
+                                               $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key]));
                                        }
                                }
                        }
@@ -3023,7 +2957,7 @@ class SimplePie
                                        $this->data['ordered_items'] = $this->data['items'];
                                        if ($do_sort)
                                        {
-                                               usort($this->data['ordered_items'], array(&$this, 'sort_items'));
+                                               usort($this->data['ordered_items'], array(get_class($this), 'sort_items'));
                                        }
                                }
                                $items = $this->data['ordered_items'];
@@ -3050,24 +2984,98 @@ class SimplePie
        }
 
        /**
-        * @static
+        * Set the favicon handler
+        *
+        * @deprecated Use your own favicon handling instead
+        */
+       public function set_favicon_handler($page = false, $qs = 'i')
+       {
+               $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
+               trigger_error('Favicon handling has been removed, please use your own handling', $level);
+               return false;
+       }
+
+       /**
+        * Get the favicon for the current feed
+        *
+        * @deprecated Use your own favicon handling instead
+        */
+       public function get_favicon()
+       {
+               $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
+               trigger_error('Favicon handling has been removed, please use your own handling', $level);
+
+               if (($url = $this->get_link()) !== null)
+               {
+                       return 'http://g.etfv.co/' . urlencode($url);
+               }
+
+               return false;
+       }
+
+       /**
+        * Magic method handler
+        *
+        * @param string $method Method name
+        * @param array $args Arguments to the method
+        * @return mixed
+        */
+       public function __call($method, $args)
+       {
+               if (strpos($method, 'subscribe_') === 0)
+               {
+                       $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
+                       trigger_error('subscribe_*() has been deprecated, implement the callback yourself', $level);
+                       return '';
+               }
+               if ($method === 'enable_xml_dump')
+               {
+                       $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING;
+                       trigger_error('enable_xml_dump() has been deprecated, use get_raw_data() instead', $level);
+                       return false;
+               }
+
+               $class = get_class($this);
+               $trace = debug_backtrace();
+               $file = $trace[0]['file'];
+               $line = $trace[0]['line'];
+               trigger_error("Call to undefined method $class::$method() in $file on line $line", E_USER_ERROR);
+       }
+
+       /**
+        * Sorting callback for items
+        *
+        * @access private
+        * @param SimplePie $a
+        * @param SimplePie $b
+        * @return boolean
         */
-       function sort_items($a, $b)
+       public static function sort_items($a, $b)
        {
                return $a->get_date('U') <= $b->get_date('U');
        }
 
        /**
-        * @static
+        * Merge items from several feeds into one
+        *
+        * If you're merging multiple feeds together, they need to all have dates
+        * for the items or else SimplePie will refuse to sort them.
+        *
+        * @link http://simplepie.org/wiki/tutorial/sort_multiple_feeds_by_time_and_date#if_feeds_require_separate_per-feed_settings
+        * @param array $urls List of SimplePie feed objects to merge
+        * @param int $start Starting item
+        * @param int $end Number of items to return
+        * @param int $limit Maximum number of items per feed
+        * @return array
         */
-       function merge_items($urls, $start = 0, $end = 0, $limit = 0)
+       public static function merge_items($urls, $start = 0, $end = 0, $limit = 0)
        {
                if (is_array($urls) && sizeof($urls) > 0)
                {
                        $items = array();
                        foreach ($urls as $arg)
                        {
-                               if (is_a($arg, 'SimplePie'))
+                               if ($arg instanceof SimplePie)
                                {
                                        $items = array_merge($items, $arg->get_items(0, $limit));
                                }
@@ -3089,7 +3097,7 @@ class SimplePie
                        $item = null;
                        if ($do_sort)
                        {
-                               usort($items, array('SimplePie', 'sort_items'));
+                               usort($items, array(get_class($urls[0]), 'sort_items'));
                        }
 
                        if ($end === 0)
@@ -3108,12193 +3116,4 @@ class SimplePie
                }
        }
 }
-
-class SimplePie_Item
-{
-       var $feed;
-       var $data = array();
-
-       function SimplePie_Item($feed, $data)
-       {
-               $this->feed = $feed;
-               $this->data = $data;
-       }
-
-       function __toString()
-       {
-               return md5(serialize($this->data));
-       }
-
-       /**
-        * Remove items that link back to this before destroying this object
-        */
-       function __destruct()
-       {
-               if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode'))
-               {
-                       unset($this->feed);
-               }
-       }
-
-       function get_item_tags($namespace, $tag)
-       {
-               if (isset($this->data['child'][$namespace][$tag]))
-               {
-                       return $this->data['child'][$namespace][$tag];
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function get_base($element = array())
-       {
-               return $this->feed->get_base($element);
-       }
-
-       function sanitize($data, $type, $base = '')
-       {
-               return $this->feed->sanitize($data, $type, $base);
-       }
-
-       function get_feed()
-       {
-               return $this->feed;
-       }
-
-       function get_id($hash = false)
-       {
-               if (!$hash)
-               {
-                       if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id'))
-                       {
-                               return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id'))
-                       {
-                               return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))
-                       {
-                               return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier'))
-                       {
-                               return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier'))
-                       {
-                               return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       elseif (($return = $this->get_permalink()) !== null)
-                       {
-                               return $return;
-                       }
-                       elseif (($return = $this->get_title()) !== null)
-                       {
-                               return $return;
-                       }
-               }
-               if ($this->get_permalink() !== null || $this->get_title() !== null)
-               {
-                       return md5($this->get_permalink() . $this->get_title());
-               }
-               else
-               {
-                       return md5(serialize($this->data));
-               }
-       }
-
-       function get_title()
-       {
-               if (!isset($this->data['title']))
-               {
-                       if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title'))
-                       {
-                               $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title'))
-                       {
-                               $this->data['title'] = $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title'))
-                       {
-                               $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title'))
-                       {
-                               $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title'))
-                       {
-                               $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title'))
-                       {
-                               $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title'))
-                       {
-                               $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       else
-                       {
-                               $this->data['title'] = null;
-                       }
-               }
-               return $this->data['title'];
-       }
-
-       function get_description($description_only = false)
-       {
-               if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary'))
-               {
-                       return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
-               }
-               elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary'))
-               {
-                       return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
-               }
-               elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description'))
-               {
-                       return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0]));
-               }
-               elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description'))
-               {
-                       return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
-               }
-               elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description'))
-               {
-                       return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-               }
-               elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description'))
-               {
-                       return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-               }
-               elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary'))
-               {
-                       return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
-               }
-               elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle'))
-               {
-                       return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-               }
-               elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description'))
-               {
-                       return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML);
-               }
-
-               elseif (!$description_only)
-               {
-                       return $this->get_content(true);
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function get_content($content_only = false)
-       {
-               if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content'))
-               {
-                       return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_content_construct_type($return[0]['attribs']), $this->get_base($return[0]));
-               }
-               elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content'))
-               {
-                       return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_03_construct_type($return[0]['attribs']), $this->get_base($return[0]));
-               }
-               elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded'))
-               {
-                       return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0]));
-               }
-               elseif (!$content_only)
-               {
-                       return $this->get_description(true);
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function get_category($key = 0)
-       {
-               $categories = $this->get_categories();
-               if (isset($categories[$key]))
-               {
-                       return $categories[$key];
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function get_categories()
-       {
-               $categories = array();
-
-               foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category)
-               {
-                       $term = null;
-                       $scheme = null;
-                       $label = null;
-                       if (isset($category['attribs']['']['term']))
-                       {
-                               $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       if (isset($category['attribs']['']['scheme']))
-                       {
-                               $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       if (isset($category['attribs']['']['label']))
-                       {
-                               $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       $categories[] =& new $this->feed->category_class($term, $scheme, $label);
-               }
-               foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category)
-               {
-                       // This is really the label, but keep this as the term also for BC.
-                       // Label will also work on retrieving because that falls back to term.
-                       $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       if (isset($category['attribs']['']['domain']))
-                       {
-                               $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       else
-                       {
-                               $scheme = null;
-                       }
-                       $categories[] =& new $this->feed->category_class($term, $scheme, null);
-               }
-               foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category)
-               {
-                       $categories[] =& new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
-               }
-               foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category)
-               {
-                       $categories[] =& new $this->feed->category_class($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
-               }
-
-               if (!empty($categories))
-               {
-                       return SimplePie_Misc::array_unique($categories);
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function get_author($key = 0)
-       {
-               $authors = $this->get_authors();
-               if (isset($authors[$key]))
-               {
-                       return $authors[$key];
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function get_contributor($key = 0)
-       {
-               $contributors = $this->get_contributors();
-               if (isset($contributors[$key]))
-               {
-                       return $contributors[$key];
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function get_contributors()
-       {
-               $contributors = array();
-               foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor)
-               {
-                       $name = null;
-                       $uri = null;
-                       $email = null;
-                       if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
-                       {
-                               $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
-                       {
-                               $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
-                       }
-                       if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
-                       {
-                               $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       if ($name !== null || $email !== null || $uri !== null)
-                       {
-                               $contributors[] =& new $this->feed->author_class($name, $uri, $email);
-                       }
-               }
-               foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor)
-               {
-                       $name = null;
-                       $url = null;
-                       $email = null;
-                       if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
-                       {
-                               $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
-                       {
-                               $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
-                       }
-                       if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
-                       {
-                               $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       if ($name !== null || $email !== null || $url !== null)
-                       {
-                               $contributors[] =& new $this->feed->author_class($name, $url, $email);
-                       }
-               }
-
-               if (!empty($contributors))
-               {
-                       return SimplePie_Misc::array_unique($contributors);
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function get_authors()
-       {
-               $authors = array();
-               foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author)
-               {
-                       $name = null;
-                       $uri = null;
-                       $email = null;
-                       if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data']))
-                       {
-                               $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data']))
-                       {
-                               $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]));
-                       }
-                       if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data']))
-                       {
-                               $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       if ($name !== null || $email !== null || $uri !== null)
-                       {
-                               $authors[] =& new $this->feed->author_class($name, $uri, $email);
-                       }
-               }
-               if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author'))
-               {
-                       $name = null;
-                       $url = null;
-                       $email = null;
-                       if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data']))
-                       {
-                               $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data']))
-                       {
-                               $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]));
-                       }
-                       if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data']))
-                       {
-                               $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                       }
-                       if ($name !== null || $email !== null || $url !== null)
-                       {
-                               $authors[] =& new $this->feed->author_class($name, $url, $email);
-                       }
-               }
-               if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author'))
-               {
-                       $authors[] =& new $this->feed->author_class(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
-               }
-               foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author)
-               {
-                       $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
-               }
-               foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author)
-               {
-                       $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
-               }
-               foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author)
-               {
-                       $authors[] =& new $this->feed->author_class($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null);
-               }
-
-               if (!empty($authors))
-               {
-                       return SimplePie_Misc::array_unique($authors);
-               }
-               elseif (($source = $this->get_source()) && ($authors = $source->get_authors()))
-               {
-                       return $authors;
-               }
-               elseif ($authors = $this->feed->get_authors())
-               {
-                       return $authors;
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function get_copyright()
-       {
-               if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights'))
-               {
-                       return $this->sanitize($return[0]['data'], SimplePie_Misc::atom_10_construct_type($return[0]['attribs']), $this->get_base($return[0]));
-               }
-               elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights'))
-               {
-                       return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-               }
-               elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights'))
-               {
-                       return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function get_date($date_format = 'j F Y, g:i a')
-       {
-               if (!isset($this->data['date']))
-               {
-                       if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published'))
-                       {
-                               $this->data['date']['raw'] = $return[0]['data'];
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated'))
-                       {
-                               $this->data['date']['raw'] = $return[0]['data'];
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued'))
-                       {
-                               $this->data['date']['raw'] = $return[0]['data'];
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created'))
-                       {
-                               $this->data['date']['raw'] = $return[0]['data'];
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified'))
-                       {
-                               $this->data['date']['raw'] = $return[0]['data'];
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate'))
-                       {
-                               $this->data['date']['raw'] = $return[0]['data'];
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date'))
-                       {
-                               $this->data['date']['raw'] = $return[0]['data'];
-                       }
-                       elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date'))
-                       {
-                               $this->data['date']['raw'] = $return[0]['data'];
-                       }
-
-                       if (!empty($this->data['date']['raw']))
-                       {
-                               $parser = SimplePie_Parse_Date::get();
-                               $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']);
-                       }
-                       else
-                       {
-                               $this->data['date'] = null;
-                       }
-               }
-               if ($this->data['date'])
-               {
-                       $date_format = (string) $date_format;
-                       switch ($date_format)
-                       {
-                               case '':
-                                       return $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT);
-
-                               case 'U':
-                                       return $this->data['date']['parsed'];
-
-                               default:
-                                       return date($date_format, $this->data['date']['parsed']);
-                       }
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function get_local_date($date_format = '%c')
-       {
-               if (!$date_format)
-               {
-                       return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT);
-               }
-               elseif (($date = $this->get_date('U')) !== null && $date !== false)
-               {
-                       return strftime($date_format, $date);
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function get_permalink()
-       {
-               $link = $this->get_link();
-               $enclosure = $this->get_enclosure(0);
-               if ($link !== null)
-               {
-                       return $link;
-               }
-               elseif ($enclosure !== null)
-               {
-                       return $enclosure->get_link();
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function get_link($key = 0, $rel = 'alternate')
-       {
-               $links = $this->get_links($rel);
-               if ($links[$key] !== null)
-               {
-                       return $links[$key];
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       function get_links($rel = 'alternate')
-       {
-               if (!isset($this->data['links']))
-               {
-                       $this->data['links'] = array();
-                       foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link)
-                       {
-                               if (isset($link['attribs']['']['href']))
-                               {
-                                       $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
-                                       $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
-
-                               }
-                       }
-                       foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link)
-                       {
-                               if (isset($link['attribs']['']['href']))
-                               {
-                                       $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate';
-                                       $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link));
-                               }
-                       }
-                       if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link'))
-                       {
-                               $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
-                       }
-                       if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link'))
-                       {
-                               $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
-                       }
-                       if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link'))
-                       {
-                               $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
-                       }
-                       if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid'))
-                       {
-                               if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true')
-                               {
-                                       $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0]));
-                               }
-                       }
-
-                       $keys = array_keys($this->data['links']);
-                       foreach ($keys as $key)
-                       {
-                               if (SimplePie_Misc::is_isegment_nz_nc($key))
-                               {
-                                       if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]))
-                                       {
-                                               $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]);
-                                               $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key];
-                                       }
-                                       else
-                                       {
-                                               $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key];
-                                       }
-                               }
-                               elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY)
-                               {
-                                       $this->data['links'][substr($key, 41)] =& $this->data['links'][$key];
-                               }
-                               $this->data['links'][$key] = array_unique($this->data['links'][$key]);
-                       }
-               }
-               if (isset($this->data['links'][$rel]))
-               {
-                       return $this->data['links'][$rel];
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       /**
-        * @todo Add ability to prefer one type of content over another (in a media group).
-        */
-       function get_enclosure($key = 0, $prefer = null)
-       {
-               $enclosures = $this->get_enclosures();
-               if (isset($enclosures[$key]))
-               {
-                       return $enclosures[$key];
-               }
-               else
-               {
-                       return null;
-               }
-       }
-
-       /**
-        * Grabs all available enclosures (podcasts, etc.)
-        *
-        * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS.
-        *
-        * At this point, we're pretty much assuming that all enclosures for an item are the same content.  Anything else is too complicated to properly support.
-        *
-        * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4).
-        * @todo If an element exists at a level, but it's value is empty, we should fall back to the value from the parent (if it exists).
-        */
-       function get_enclosures()
-       {
-               if (!isset($this->data['enclosures']))
-               {
-                       $this->data['enclosures'] = array();
-
-                       // Elements
-                       $captions_parent = null;
-                       $categories_parent = null;
-                       $copyrights_parent = null;
-                       $credits_parent = null;
-                       $description_parent = null;
-                       $duration_parent = null;
-                       $hashes_parent = null;
-                       $keywords_parent = null;
-                       $player_parent = null;
-                       $ratings_parent = null;
-                       $restrictions_parent = null;
-                       $thumbnails_parent = null;
-                       $title_parent = null;
-
-                       // Let's do the channel and item-level ones first, and just re-use them if we need to.
-                       $parent = $this->get_feed();
-
-                       // CAPTIONS
-                       if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
-                       {
-                               foreach ($captions as $caption)
-                               {
-                                       $caption_type = null;
-                                       $caption_lang = null;
-                                       $caption_startTime = null;
-                                       $caption_endTime = null;
-                                       $caption_text = null;
-                                       if (isset($caption['attribs']['']['type']))
-                                       {
-                                               $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($caption['attribs']['']['lang']))
-                                       {
-                                               $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($caption['attribs']['']['start']))
-                                       {
-                                               $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($caption['attribs']['']['end']))
-                                       {
-                                               $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($caption['data']))
-                                       {
-                                               $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       $captions_parent[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
-                               }
-                       }
-                       elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text'))
-                       {
-                               foreach ($captions as $caption)
-                               {
-                                       $caption_type = null;
-                                       $caption_lang = null;
-                                       $caption_startTime = null;
-                                       $caption_endTime = null;
-                                       $caption_text = null;
-                                       if (isset($caption['attribs']['']['type']))
-                                       {
-                                               $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($caption['attribs']['']['lang']))
-                                       {
-                                               $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($caption['attribs']['']['start']))
-                                       {
-                                               $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($caption['attribs']['']['end']))
-                                       {
-                                               $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($caption['data']))
-                                       {
-                                               $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       $captions_parent[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
-                               }
-                       }
-                       if (is_array($captions_parent))
-                       {
-                               $captions_parent = array_values(SimplePie_Misc::array_unique($captions_parent));
-                       }
-
-                       // CATEGORIES
-                       foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
-                       {
-                               $term = null;
-                               $scheme = null;
-                               $label = null;
-                               if (isset($category['data']))
-                               {
-                                       $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                               if (isset($category['attribs']['']['scheme']))
-                               {
-                                       $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                               else
-                               {
-                                       $scheme = 'http://search.yahoo.com/mrss/category_schema';
-                               }
-                               if (isset($category['attribs']['']['label']))
-                               {
-                                       $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                               $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
-                       }
-                       foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category)
-                       {
-                               $term = null;
-                               $scheme = null;
-                               $label = null;
-                               if (isset($category['data']))
-                               {
-                                       $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                               if (isset($category['attribs']['']['scheme']))
-                               {
-                                       $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                               else
-                               {
-                                       $scheme = 'http://search.yahoo.com/mrss/category_schema';
-                               }
-                               if (isset($category['attribs']['']['label']))
-                               {
-                                       $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                               $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
-                       }
-                       foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category)
-                       {
-                               $term = null;
-                               $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd';
-                               $label = null;
-                               if (isset($category['attribs']['']['text']))
-                               {
-                                       $label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                               $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
-
-                               if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category']))
-                               {
-                                       foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory)
-                                       {
-                                               if (isset($subcategory['attribs']['']['text']))
-                                               {
-                                                       $label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                               }
-                                               $categories_parent[] =& new $this->feed->category_class($term, $scheme, $label);
-                                       }
-                               }
-                       }
-                       if (is_array($categories_parent))
-                       {
-                               $categories_parent = array_values(SimplePie_Misc::array_unique($categories_parent));
-                       }
-
-                       // COPYRIGHT
-                       if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
-                       {
-                               $copyright_url = null;
-                               $copyright_label = null;
-                               if (isset($copyright[0]['attribs']['']['url']))
-                               {
-                                       $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                               if (isset($copyright[0]['data']))
-                               {
-                                       $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                               $copyrights_parent =& new $this->feed->copyright_class($copyright_url, $copyright_label);
-                       }
-                       elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright'))
-                       {
-                               $copyright_url = null;
-                               $copyright_label = null;
-                               if (isset($copyright[0]['attribs']['']['url']))
-                               {
-                                       $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                               if (isset($copyright[0]['data']))
-                               {
-                                       $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                               $copyrights_parent =& new $this->feed->copyright_class($copyright_url, $copyright_label);
-                       }
-
-                       // CREDITS
-                       if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
-                       {
-                               foreach ($credits as $credit)
-                               {
-                                       $credit_role = null;
-                                       $credit_scheme = null;
-                                       $credit_name = null;
-                                       if (isset($credit['attribs']['']['role']))
-                                       {
-                                               $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($credit['attribs']['']['scheme']))
-                                       {
-                                               $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       else
-                                       {
-                                               $credit_scheme = 'urn:ebu';
-                                       }
-                                       if (isset($credit['data']))
-                                       {
-                                               $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       $credits_parent[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
-                               }
-                       }
-                       elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit'))
-                       {
-                               foreach ($credits as $credit)
-                               {
-                                       $credit_role = null;
-                                       $credit_scheme = null;
-                                       $credit_name = null;
-                                       if (isset($credit['attribs']['']['role']))
-                                       {
-                                               $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($credit['attribs']['']['scheme']))
-                                       {
-                                               $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       else
-                                       {
-                                               $credit_scheme = 'urn:ebu';
-                                       }
-                                       if (isset($credit['data']))
-                                       {
-                                               $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       $credits_parent[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
-                               }
-                       }
-                       if (is_array($credits_parent))
-                       {
-                               $credits_parent = array_values(SimplePie_Misc::array_unique($credits_parent));
-                       }
-
-                       // DESCRIPTION
-                       if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
-                       {
-                               if (isset($description_parent[0]['data']))
-                               {
-                                       $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                       }
-                       elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description'))
-                       {
-                               if (isset($description_parent[0]['data']))
-                               {
-                                       $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                       }
-
-                       // DURATION
-                       if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration'))
-                       {
-                               $seconds = null;
-                               $minutes = null;
-                               $hours = null;
-                               if (isset($duration_parent[0]['data']))
-                               {
-                                       $temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
-                                       if (sizeof($temp) > 0)
-                                       {
-                                               $seconds = (int) array_pop($temp);
-                                       }
-                                       if (sizeof($temp) > 0)
-                                       {
-                                               $minutes = (int) array_pop($temp);
-                                               $seconds += $minutes * 60;
-                                       }
-                                       if (sizeof($temp) > 0)
-                                       {
-                                               $hours = (int) array_pop($temp);
-                                               $seconds += $hours * 3600;
-                                       }
-                                       unset($temp);
-                                       $duration_parent = $seconds;
-                               }
-                       }
-
-                       // HASHES
-                       if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
-                       {
-                               foreach ($hashes_iterator as $hash)
-                               {
-                                       $value = null;
-                                       $algo = null;
-                                       if (isset($hash['data']))
-                                       {
-                                               $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($hash['attribs']['']['algo']))
-                                       {
-                                               $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       else
-                                       {
-                                               $algo = 'md5';
-                                       }
-                                       $hashes_parent[] = $algo.':'.$value;
-                               }
-                       }
-                       elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash'))
-                       {
-                               foreach ($hashes_iterator as $hash)
-                               {
-                                       $value = null;
-                                       $algo = null;
-                                       if (isset($hash['data']))
-                                       {
-                                               $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($hash['attribs']['']['algo']))
-                                       {
-                                               $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       else
-                                       {
-                                               $algo = 'md5';
-                                       }
-                                       $hashes_parent[] = $algo.':'.$value;
-                               }
-                       }
-                       if (is_array($hashes_parent))
-                       {
-                               $hashes_parent = array_values(SimplePie_Misc::array_unique($hashes_parent));
-                       }
-
-                       // KEYWORDS
-                       if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
-                       {
-                               if (isset($keywords[0]['data']))
-                               {
-                                       $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
-                                       foreach ($temp as $word)
-                                       {
-                                               $keywords_parent[] = trim($word);
-                                       }
-                               }
-                               unset($temp);
-                       }
-                       elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
-                       {
-                               if (isset($keywords[0]['data']))
-                               {
-                                       $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
-                                       foreach ($temp as $word)
-                                       {
-                                               $keywords_parent[] = trim($word);
-                                       }
-                               }
-                               unset($temp);
-                       }
-                       elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords'))
-                       {
-                               if (isset($keywords[0]['data']))
-                               {
-                                       $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
-                                       foreach ($temp as $word)
-                                       {
-                                               $keywords_parent[] = trim($word);
-                                       }
-                               }
-                               unset($temp);
-                       }
-                       elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords'))
-                       {
-                               if (isset($keywords[0]['data']))
-                               {
-                                       $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
-                                       foreach ($temp as $word)
-                                       {
-                                               $keywords_parent[] = trim($word);
-                                       }
-                               }
-                               unset($temp);
-                       }
-                       if (is_array($keywords_parent))
-                       {
-                               $keywords_parent = array_values(SimplePie_Misc::array_unique($keywords_parent));
-                       }
-
-                       // PLAYER
-                       if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
-                       {
-                               if (isset($player_parent[0]['attribs']['']['url']))
-                               {
-                                       $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
-                               }
-                       }
-                       elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player'))
-                       {
-                               if (isset($player_parent[0]['attribs']['']['url']))
-                               {
-                                       $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
-                               }
-                       }
-
-                       // RATINGS
-                       if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
-                       {
-                               foreach ($ratings as $rating)
-                               {
-                                       $rating_scheme = null;
-                                       $rating_value = null;
-                                       if (isset($rating['attribs']['']['scheme']))
-                                       {
-                                               $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       else
-                                       {
-                                               $rating_scheme = 'urn:simple';
-                                       }
-                                       if (isset($rating['data']))
-                                       {
-                                               $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
-                               }
-                       }
-                       elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
-                       {
-                               foreach ($ratings as $rating)
-                               {
-                                       $rating_scheme = 'urn:itunes';
-                                       $rating_value = null;
-                                       if (isset($rating['data']))
-                                       {
-                                               $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
-                               }
-                       }
-                       elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating'))
-                       {
-                               foreach ($ratings as $rating)
-                               {
-                                       $rating_scheme = null;
-                                       $rating_value = null;
-                                       if (isset($rating['attribs']['']['scheme']))
-                                       {
-                                               $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       else
-                                       {
-                                               $rating_scheme = 'urn:simple';
-                                       }
-                                       if (isset($rating['data']))
-                                       {
-                                               $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
-                               }
-                       }
-                       elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit'))
-                       {
-                               foreach ($ratings as $rating)
-                               {
-                                       $rating_scheme = 'urn:itunes';
-                                       $rating_value = null;
-                                       if (isset($rating['data']))
-                                       {
-                                               $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       $ratings_parent[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
-                               }
-                       }
-                       if (is_array($ratings_parent))
-                       {
-                               $ratings_parent = array_values(SimplePie_Misc::array_unique($ratings_parent));
-                       }
-
-                       // RESTRICTIONS
-                       if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
-                       {
-                               foreach ($restrictions as $restriction)
-                               {
-                                       $restriction_relationship = null;
-                                       $restriction_type = null;
-                                       $restriction_value = null;
-                                       if (isset($restriction['attribs']['']['relationship']))
-                                       {
-                                               $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($restriction['attribs']['']['type']))
-                                       {
-                                               $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($restriction['data']))
-                                       {
-                                               $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
-                               }
-                       }
-                       elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
-                       {
-                               foreach ($restrictions as $restriction)
-                               {
-                                       $restriction_relationship = 'allow';
-                                       $restriction_type = null;
-                                       $restriction_value = 'itunes';
-                                       if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')
-                                       {
-                                               $restriction_relationship = 'deny';
-                                       }
-                                       $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
-                               }
-                       }
-                       elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction'))
-                       {
-                               foreach ($restrictions as $restriction)
-                               {
-                                       $restriction_relationship = null;
-                                       $restriction_type = null;
-                                       $restriction_value = null;
-                                       if (isset($restriction['attribs']['']['relationship']))
-                                       {
-                                               $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($restriction['attribs']['']['type']))
-                                       {
-                                               $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       if (isset($restriction['data']))
-                                       {
-                                               $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                       }
-                                       $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
-                               }
-                       }
-                       elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block'))
-                       {
-                               foreach ($restrictions as $restriction)
-                               {
-                                       $restriction_relationship = 'allow';
-                                       $restriction_type = null;
-                                       $restriction_value = 'itunes';
-                                       if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes')
-                                       {
-                                               $restriction_relationship = 'deny';
-                                       }
-                                       $restrictions_parent[] =& new $this->feed->restriction_class($restriction_relationship, $restriction_type, $restriction_value);
-                               }
-                       }
-                       if (is_array($restrictions_parent))
-                       {
-                               $restrictions_parent = array_values(SimplePie_Misc::array_unique($restrictions_parent));
-                       }
-
-                       // THUMBNAILS
-                       if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
-                       {
-                               foreach ($thumbnails as $thumbnail)
-                               {
-                                       if (isset($thumbnail['attribs']['']['url']))
-                                       {
-                                               $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
-                                       }
-                               }
-                       }
-                       elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail'))
-                       {
-                               foreach ($thumbnails as $thumbnail)
-                               {
-                                       if (isset($thumbnail['attribs']['']['url']))
-                                       {
-                                               $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
-                                       }
-                               }
-                       }
-
-                       // TITLES
-                       if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
-                       {
-                               if (isset($title_parent[0]['data']))
-                               {
-                                       $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                       }
-                       elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title'))
-                       {
-                               if (isset($title_parent[0]['data']))
-                               {
-                                       $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                               }
-                       }
-
-                       // Clear the memory
-                       unset($parent);
-
-                       // Attributes
-                       $bitrate = null;
-                       $channels = null;
-                       $duration = null;
-                       $expression = null;
-                       $framerate = null;
-                       $height = null;
-                       $javascript = null;
-                       $lang = null;
-                       $length = null;
-                       $medium = null;
-                       $samplingrate = null;
-                       $type = null;
-                       $url = null;
-                       $width = null;
-
-                       // Elements
-                       $captions = null;
-                       $categories = null;
-                       $copyrights = null;
-                       $credits = null;
-                       $description = null;
-                       $hashes = null;
-                       $keywords = null;
-                       $player = null;
-                       $ratings = null;
-                       $restrictions = null;
-                       $thumbnails = null;
-                       $title = null;
-
-                       // If we have media:group tags, loop through them.
-                       foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group)
-                       {
-                               if(isset($group['child']) && isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']))
-                               {
-                                       // If we have media:content tags, loop through them.
-                                       foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content)
-                                       {
-                                               if (isset($content['attribs']['']['url']))
-                                               {
-                                                       // Attributes
-                                                       $bitrate = null;
-                                                       $channels = null;
-                                                       $duration = null;
-                                                       $expression = null;
-                                                       $framerate = null;
-                                                       $height = null;
-                                                       $javascript = null;
-                                                       $lang = null;
-                                                       $length = null;
-                                                       $medium = null;
-                                                       $samplingrate = null;
-                                                       $type = null;
-                                                       $url = null;
-                                                       $width = null;
-
-                                                       // Elements
-                                                       $captions = null;
-                                                       $categories = null;
-                                                       $copyrights = null;
-                                                       $credits = null;
-                                                       $description = null;
-                                                       $hashes = null;
-                                                       $keywords = null;
-                                                       $player = null;
-                                                       $ratings = null;
-                                                       $restrictions = null;
-                                                       $thumbnails = null;
-                                                       $title = null;
-
-                                                       // Start checking the attributes of media:content
-                                                       if (isset($content['attribs']['']['bitrate']))
-                                                       {
-                                                               $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                       }
-                                                       if (isset($content['attribs']['']['channels']))
-                                                       {
-                                                               $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                       }
-                                                       if (isset($content['attribs']['']['duration']))
-                                                       {
-                                                               $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                       }
-                                                       else
-                                                       {
-                                                               $duration = $duration_parent;
-                                                       }
-                                                       if (isset($content['attribs']['']['expression']))
-                                                       {
-                                                               $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                       }
-                                                       if (isset($content['attribs']['']['framerate']))
-                                                       {
-                                                               $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                       }
-                                                       if (isset($content['attribs']['']['height']))
-                                                       {
-                                                               $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                       }
-                                                       if (isset($content['attribs']['']['lang']))
-                                                       {
-                                                               $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                       }
-                                                       if (isset($content['attribs']['']['fileSize']))
-                                                       {
-                                                               $length = ceil($content['attribs']['']['fileSize']);
-                                                       }
-                                                       if (isset($content['attribs']['']['medium']))
-                                                       {
-                                                               $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                       }
-                                                       if (isset($content['attribs']['']['samplingrate']))
-                                                       {
-                                                               $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                       }
-                                                       if (isset($content['attribs']['']['type']))
-                                                       {
-                                                               $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                       }
-                                                       if (isset($content['attribs']['']['width']))
-                                                       {
-                                                               $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                       }
-                                                       $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
-
-                                                       // Checking the other optional media: elements. Priority: media:content, media:group, item, channel
-
-                                                       // CAPTIONS
-                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
-                                                       {
-                                                               foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
-                                                               {
-                                                                       $caption_type = null;
-                                                                       $caption_lang = null;
-                                                                       $caption_startTime = null;
-                                                                       $caption_endTime = null;
-                                                                       $caption_text = null;
-                                                                       if (isset($caption['attribs']['']['type']))
-                                                                       {
-                                                                               $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       if (isset($caption['attribs']['']['lang']))
-                                                                       {
-                                                                               $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       if (isset($caption['attribs']['']['start']))
-                                                                       {
-                                                                               $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       if (isset($caption['attribs']['']['end']))
-                                                                       {
-                                                                               $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       if (isset($caption['data']))
-                                                                       {
-                                                                               $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       $captions[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
-                                                               }
-                                                               if (is_array($captions))
-                                                               {
-                                                                       $captions = array_values(SimplePie_Misc::array_unique($captions));
-                                                               }
-                                                       }
-                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text']))
-                                                       {
-                                                               foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption)
-                                                               {
-                                                                       $caption_type = null;
-                                                                       $caption_lang = null;
-                                                                       $caption_startTime = null;
-                                                                       $caption_endTime = null;
-                                                                       $caption_text = null;
-                                                                       if (isset($caption['attribs']['']['type']))
-                                                                       {
-                                                                               $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       if (isset($caption['attribs']['']['lang']))
-                                                                       {
-                                                                               $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       if (isset($caption['attribs']['']['start']))
-                                                                       {
-                                                                               $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       if (isset($caption['attribs']['']['end']))
-                                                                       {
-                                                                               $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       if (isset($caption['data']))
-                                                                       {
-                                                                               $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       $captions[] =& new $this->feed->caption_class($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text);
-                                                               }
-                                                               if (is_array($captions))
-                                                               {
-                                                                       $captions = array_values(SimplePie_Misc::array_unique($captions));
-                                                               }
-                                                       }
-                                                       else
-                                                       {
-                                                               $captions = $captions_parent;
-                                                       }
-
-                                                       // CATEGORIES
-                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
-                                                       {
-                                                               foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
-                                                               {
-                                                                       $term = null;
-                                                                       $scheme = null;
-                                                                       $label = null;
-                                                                       if (isset($category['data']))
-                                                                       {
-                                                                               $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       if (isset($category['attribs']['']['scheme']))
-                                                                       {
-                                                                               $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       else
-                                                                       {
-                                                                               $scheme = 'http://search.yahoo.com/mrss/category_schema';
-                                                                       }
-                                                                       if (isset($category['attribs']['']['label']))
-                                                                       {
-                                                                               $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       $categories[] =& new $this->feed->category_class($term, $scheme, $label);
-                                                               }
-                                                       }
-                                                       if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category']))
-                                                       {
-                                                               foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category)
-                                                               {
-                                                                       $term = null;
-                                                                       $scheme = null;
-                                                                       $label = null;
-                                                                       if (isset($category['data']))
-                                                                       {
-                                                                               $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       if (isset($category['attribs']['']['scheme']))
-                                                                       {
-                                                                               $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       else
-                                                                       {
-                                                                               $scheme = 'http://search.yahoo.com/mrss/category_schema';
-                                                                       }
-                                                                       if (isset($category['attribs']['']['label']))
-                                                                       {
-                                                                               $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       $categories[] =& new $this->feed->category_class($term, $scheme, $label);
-                                                               }
-                                                       }
-                                                       if (is_array($categories) && is_array($categories_parent))
-                                                       {
-                                                               $categories = array_values(SimplePie_Misc::array_unique(array_merge($categories, $categories_parent)));
-                                                       }
-                                                       elseif (is_array($categories))
-                                                       {
-                                                               $categories = array_values(SimplePie_Misc::array_unique($categories));
-                                                       }
-                                                       elseif (is_array($categories_parent))
-                                                       {
-                                                               $categories = array_values(SimplePie_Misc::array_unique($categories_parent));
-                                                       }
-
-                                                       // COPYRIGHTS
-                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
-                                                       {
-                                                               $copyright_url = null;
-                                                               $copyright_label = null;
-                                                               if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
-                                                               {
-                                                                       $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                               }
-                                                               if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
-                                                               {
-                                                                       $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                               }
-                                                               $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label);
-                                                       }
-                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright']))
-                                                       {
-                                                               $copyright_url = null;
-                                                               $copyright_label = null;
-                                                               if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url']))
-                                                               {
-                                                                       $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                               }
-                                                               if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data']))
-                                                               {
-                                                                       $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                               }
-                                                               $copyrights =& new $this->feed->copyright_class($copyright_url, $copyright_label);
-                                                       }
-                                                       else
-                                                       {
-                                                               $copyrights = $copyrights_parent;
-                                                       }
-
-                                                       // CREDITS
-                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
-                                                       {
-                                                               foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
-                                                               {
-                                                                       $credit_role = null;
-                                                                       $credit_scheme = null;
-                                                                       $credit_name = null;
-                                                                       if (isset($credit['attribs']['']['role']))
-                                                                       {
-                                                                               $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       if (isset($credit['attribs']['']['scheme']))
-                                                                       {
-                                                                               $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       else
-                                                                       {
-                                                                               $credit_scheme = 'urn:ebu';
-                                                                       }
-                                                                       if (isset($credit['data']))
-                                                                       {
-                                                                               $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
-                                                               }
-                                                               if (is_array($credits))
-                                                               {
-                                                                       $credits = array_values(SimplePie_Misc::array_unique($credits));
-                                                               }
-                                                       }
-                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit']))
-                                                       {
-                                                               foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit)
-                                                               {
-                                                                       $credit_role = null;
-                                                                       $credit_scheme = null;
-                                                                       $credit_name = null;
-                                                                       if (isset($credit['attribs']['']['role']))
-                                                                       {
-                                                                               $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       if (isset($credit['attribs']['']['scheme']))
-                                                                       {
-                                                                               $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       else
-                                                                       {
-                                                                               $credit_scheme = 'urn:ebu';
-                                                                       }
-                                                                       if (isset($credit['data']))
-                                                                       {
-                                                                               $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       $credits[] =& new $this->feed->credit_class($credit_role, $credit_scheme, $credit_name);
-                                                               }
-                                                               if (is_array($credits))
-                                                               {
-                                                                       $credits = array_values(SimplePie_Misc::array_unique($credits));
-                                                               }
-                                                       }
-                                                       else
-                                                       {
-                                                               $credits = $credits_parent;
-                                                       }
-
-                                                       // DESCRIPTION
-                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
-                                                       {
-                                                               $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                       }
-                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description']))
-                                                       {
-                                                               $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                       }
-                                                       else
-                                                       {
-                                                               $description = $description_parent;
-                                                       }
-
-                                                       // HASHES
-                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
-                                                       {
-                                                               foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
-                                                               {
-                                                                       $value = null;
-                                                                       $algo = null;
-                                                                       if (isset($hash['data']))
-                                                                       {
-                                                                               $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       if (isset($hash['attribs']['']['algo']))
-                                                                       {
-                                                                               $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       else
-                                                                       {
-                                                                               $algo = 'md5';
-                                                                       }
-                                                                       $hashes[] = $algo.':'.$value;
-                                                               }
-                                                               if (is_array($hashes))
-                                                               {
-                                                                       $hashes = array_values(SimplePie_Misc::array_unique($hashes));
-                                                               }
-                                                       }
-                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash']))
-                                                       {
-                                                               foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash)
-                                                               {
-                                                                       $value = null;
-                                                                       $algo = null;
-                                                                       if (isset($hash['data']))
-                                                                       {
-                                                                               $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       if (isset($hash['attribs']['']['algo']))
-                                                                       {
-                                                                               $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       else
-                                                                       {
-                                                                               $algo = 'md5';
-                                                                       }
-                                                                       $hashes[] = $algo.':'.$value;
-                                                               }
-                                                               if (is_array($hashes))
-                                                               {
-                                                                       $hashes = array_values(SimplePie_Misc::array_unique($hashes));
-                                                               }
-                                                       }
-                                                       else
-                                                       {
-                                                               $hashes = $hashes_parent;
-                                                       }
-
-                                                       // KEYWORDS
-                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
-                                                       {
-                                                               if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
-                                                               {
-                                                                       $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
-                                                                       foreach ($temp as $word)
-                                                                       {
-                                                                               $keywords[] = trim($word);
-                                                                       }
-                                                                       unset($temp);
-                                                               }
-                                                               if (is_array($keywords))
-                                                               {
-                                                                       $keywords = array_values(SimplePie_Misc::array_unique($keywords));
-                                                               }
-                                                       }
-                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords']))
-                                                       {
-                                                               if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data']))
-                                                               {
-                                                                       $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT));
-                                                                       foreach ($temp as $word)
-                                                                       {
-                                                                               $keywords[] = trim($word);
-                                                                       }
-                                                                       unset($temp);
-                                                               }
-                                                               if (is_array($keywords))
-                                                               {
-                                                                       $keywords = array_values(SimplePie_Misc::array_unique($keywords));
-                                                               }
-                                                       }
-                                                       else
-                                                       {
-                                                               $keywords = $keywords_parent;
-                                                       }
-
-                                                       // PLAYER
-                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
-                                                       {
-                                                               $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
-                                                       }
-                                                       elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player']))
-                                                       {
-                                                               $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI);
-                                                       }
-                                                       else
-                                                       {
-                                                               $player = $player_parent;
-                                                       }
-
-                                                       // RATINGS
-                                                       if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating']))
-                                                       {
-                                                               foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating)
-                                                               {
-                                                                       $rating_scheme = null;
-                                                                       $rating_value = null;
-                                                                       if (isset($rating['attribs']['']['scheme']))
-                                                                       {
-                                                                               $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       else
-                                                                       {
-                                                                               $rating_scheme = 'urn:simple';
-                                                                       }
-                                                                       if (isset($rating['data']))
-                                                                       {
-                                                                               $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT);
-                                                                       }
-                                                                       $ratings[] =& new $this->feed->rating_class($rating_scheme, $rating_value);
-                                                               }
-                                                               if (is_array($ratings))