<?php
/**
 * @copyright NetMonsters <team@netmonsters.ru>
 * @link http://netmonsters.ru
 * @package Majestic
 * @subpackage Model
 * @since 2010-02-17
 * @version SVN: $Id$
 * @filesource $URL$
 */

class Config extends ArrayObject
{
    
    private static $_instance = null;
    
    public function __construct($config = array())
    {
        parent::__construct($config, ArrayObject::ARRAY_AS_PROPS);
    }
    
    private function __clone(){}
    
    /**
     * @return Config
     */
    static public function getInstance()
    {
        if (! isset(self::$_instance)) {
            self::$_instance = new Config();
        }
        return self::$_instance;
    }
    
    static public function get($name)
    {
        $instance = self::getInstance();
        if (! $instance->offsetExists($name)) {
            throw new Exception('Configuration variable "' . $name . '" undefined');
        }
        return $instance->offsetGet($name);
    }
    
    static public function set($name, $value)
    {
        if (is_array($value)) {
            $value = new ConfigArray($value);
        }
        self::getInstance()->offsetSet($name, $value);
    }
}

class ConfigArray extends ArrayObject
{
    public function __construct($array)
    {
        parent::__construct($array, ArrayObject::ARRAY_AS_PROPS);
    }
    
    public function offsetGet($index) 
    {
        if (! $this->offsetExists($index)) {
            throw new Exception('Configuration variable "' . $index . '" undefined');
        }
        return parent::offsetGet($index);
    }
}