<?php
/**
* 設定値を保持するクラス
*
* PHP version 5
*
* @package    core
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class Config
{
	private $_config;

	/*
	 *    コンストラクタ
	 */
	public function __construct( $data = NULL )
	{
		$this->_config = $data ? $data : array();
	}

	/*
	 *　空か
	 */
	public function isEmptry()
	{
		return (count($this->_config) == 0);
	}

	/*
	 *　キーが存在するか
	 */
	public function keyExists( $key )
	{
		return isset($this->_config[ $key ]);
	}

	/*
	 *　配列を追加
	 */
	public function append( $add )
	{
		if ( $add ){
			if ( is_array( $add ) ){
				$this->_config = array_merge( $this->_config, $add );
			}
			else{
				$this->_config[] = $add;
			}
		}
	}

	/*
	 *　第一階層のキーを取得
	 */
	public function getKeys()
	{
		return array_keys( $this->_config );
	}

	/*
	 * 設定値を文字列として取得する
	 */
	public function getString( $key, $process_macro = NULL )
	{
		// 未設定なら空文字を返す
		if ( !isset($this->_config[ $key ]) ){
			return s('');
		}

		// 設定値を取得
		$value = $this->_config[ $key ];

		// フォーマット確認
		if ( !is_string($value) ){
			throw new StringFormatException( $value, "key=[$key]" );
		}

		// 展開フラグがFALSEの場合はそのまま返す
		if ( $process_macro == NULL || !$process_macro ){
			return s($value);
		}

		// マクロ展開して返却
		return ConfigUtil::processMacro( s($value) );
	}

	/*
	 * 設定値を配列として取得する
	 */
	public function getArray( $key )
	{
		// 未設定なら空の配列を返す
		if ( !isset($this->_config[ $key ]) ){
			return array();
		}

		// 設定値を取得
		$value = $this->_config[ $key ];

		// フォーマット確認
		if ( !is_array($value) ){
			throw new ArrayFormatException( $value, "key=[$key]" );
		}

		// 配列にして返却
		return  $value;
	}

	/*
	 * 設定値をブール値として取得する
	 */
	public function getBoolean( $key )
	{
		// 未設定ならFALSEを返す
		if ( !isset($this->_config[ $key ]) ){
			return FALSE;
		}

		// 設定値を取得
		$value = $this->_config[ $key ];

		// フォーマット確認
		if ( !is_bool($value) ){
			throw new BooleanFormatException( $value, "key=[$key]" );
		}

		// ブール型にして返却
		return $value;
	}

	/*
	 * 設定値を整数値として取得する
	 */
	public function getInteger( $key )
	{
		// 未設定ならNULLを返す
		if ( !isset($this->_config[ $key ]) ){
			return NULL;
		}

		// 設定値を取得
		$value = $this->_config[ $key ];

		// フォーマット確認
		if ( !is_integer($value) ){
			throw new IntegerFormatException( $value, "key=[$key]" );
		}

		// 整数型にして返却
		return (int)$value;
	}

	/*
	 *　設定値をダンプ
	 */
	public function dump( $key = NULL )
	{
		$title     = get_class($this);
		$line_end  = '<BR>';
		$indent    = '---';
		if ( $key ){
			// 特定のキーに対する設定値をダンプ
			$value = $this->_config[ $key ];
			System::dumpVar( $value, $title, $line_end, $indent );
		}
		else{
			// すべての設定値をダンプ
			System::dumpArray( $this->_config, $title, $line_end, $indent );
		}
	}

}