<?php

require 'RegistrySimple.Class.php';

class 
RegistryExtended extends RegistrySimple implements IteratorArrayAccessCountableSerializable
{
  protected static 
$_oInstance null;
  
  protected function 
__construct()
  {
    
// this is for require RegistryExtended::Instance();
  
}
  
  public static function 
Instance()
  {
    if(!
self::$_oInstance)
        
self::$_oInstance = new self;
    
    return 
self::$_oInstance;
  }
  
  public function 
__get($sSpaceName)
  {
    return 
self::Registry($sSpaceName);
  }
  
  public function 
__set($sSpaceName$mValue)
  {
    return 
self::Registry($sSpaceName$mValue);
  }
  
  public function 
__isset($sSpaceName)
  {
    return isset(
self::$_aRegistry[$sSpaceName]);
  }
  
  public function 
__unset($sSpaceName)
  {
    if(!isset(
self::$_aRegistry[$sSpaceName]))
      return 
false;
    
    unset(
self::$_aRegistry[$sSpaceName]);
    return 
true;
  }
  
  public function 
__sleep()
  {
    return 
$this->serialize();
  }
  
  public function 
__wakeUp()
  {
    return 
$this->unserialize();
  }
  
  
/**
   * Countable
   */
  
public function count()
  {
    return 
count($this->_aRegistry);
  }
  
  
/**
   * Iterator
   */
  
  
public function rewind()
  {
    
reset($this->_aRegistry);
  }
  
  public function 
key()
  {
    return 
key($this->_aRegistry);
  }
  
  public function 
next()
  {
    return 
next($this->_aRegistry);
  }
  
  public function 
current()
  {
    return 
current($this->_aRegistry);
  }
  
  public function 
valid()
  {
    return (
$this->current() !== false);
  }
  
  
/**
   * ArrayAccess
   */
  
  
public function offsetGet($sSpaceName)
  {
    return 
$this->__get($sSpaceName);
  }
  
  public function 
offsetSet($sSpaceName$mValue)
  {
    return 
$this->__set($sSpaceName$mValue);
  }
  
  public function 
offsetExists($sSpaceName)
  {
    return 
$this->__isset($sSpaceName);
  }

  public function 
offsetUnset($sSpaceName)
  {
    
$this->__unset($sParam);
  }
  
  
/**
   * Serializable
   */
  
  
public function serialize()
  {
    return 
serialize($this->_aAttributes);
  }
  
  public function 
unserialize($sString)
  {
    if(
is_array($aRegistry unserialize($sString)))
      return 
$this->_aRegistry $aRegistry;
    
    return 
false;
  }
}

?>