Location: PHPKode > projects > SolarPHP > solar-system-1.1.1/solar/source/solar/Solar/Registry.php
<?php
/**
 * 
 * Registry for storing objects, with built-in lazy loading.
 * 
 * @category Solar
 * 
 * @package Solar
 * 
 * @author Paul M. Jones <hide@address.com>
 * 
 * @license http://opensource.org/licenses/bsd-license.php BSD
 * 
 * @version $Id: Registry.php 3153 2008-05-05 23:14:16Z pmjones $
 * 
 */
class Solar_Registry
{
    /**
     * 
     * Map of registry names to object instances (or their specs for on-demand 
     * creation).
     * 
     * @var array
     * 
     */
    protected static $_obj = array();
    
    /**
     * 
     * Constructor is disabled to enforce a singleton pattern.
     * 
     */
    final private function __construct() {}
    
    /**
     * 
     * Accesses an object in the registry.
     * 
     * @param string $name The registered name.
     * 
     * @return object The object registered under $name.
     * 
     * @todo Localize these errors.
     * 
     */
    public static function get($name)
    {
        // has the shared object already been loaded?
        if (! Solar_Registry::exists($name)) {
            throw Solar::exception(
                'Solar_Registry',
                'ERR_NOT_IN_REGISTRY',
                "Object with name '$name' not in registry.",
                array('name' => $name)
            );
        }
        
        // was the registration for a lazy-load?
        if (is_array(Solar_Registry::$_obj[$name])) {
            $val = Solar_Registry::$_obj[$name];
            $obj = Solar::factory($val[0], $val[1]);
            Solar_Registry::$_obj[$name] = $obj;
        }
        
        // done
        return Solar_Registry::$_obj[$name];
    }
    
    /**
     * 
     * Registers an object under a unique name.
     * 
     * @param string $name The name under which to register the object.
     * 
     * @param object|string $spec The registry specification.
     * 
     * @param mixed $config If lazy-loading, use this as the config.
     * 
     * @return void
     * 
     * @todo Localize these errors.
     * 
     */
    public static function set($name, $spec, $config = null)
    {
        if (Solar_Registry::exists($name)) {
            // name already exists in registry
            $class = get_class(Solar_Registry::$_obj[$name]);
            throw Solar::exception(
                'Solar_Registry',
                'ERR_REGISTRY_NAME_EXISTS',
                "Object with '$name' of class '$class' already in registry", 
                array('name' => $name, 'class' => $class)
            );
        }
        
        // register as an object, or as a class and config?
        if (is_object($spec)) {
            // directly register the object
            Solar_Registry::$_obj[$name] = $spec;
        } elseif (is_string($spec)) {
            // register a class and config for lazy loading
            Solar_Registry::$_obj[$name] = array($spec, $config);
        } else {
            throw Solar::exception(
                'Solar_Registry',
                'ERR_REGISTRY_FAILURE',
                'Please pass an object, or a class name and a config array',
                array()
            );
        }
    }
    
    /**
     * 
     * Check to see if an object name already exists in the registry.
     * 
     * @param string $name The name to check.
     * 
     * @return bool
     * 
     */
    public static function exists($name)
    {
        return ! empty(Solar_Registry::$_obj[$name]);
    }
    
}
Return current item: SolarPHP