<?php
/**
* データ転送クラス
*
* PHP version 5
*
* @package	core
* @author	 stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class DTO implements Iterator, ArrayAccess
{
	private $_array;

	/*
	 *	コンストラクタ
	 */
	public function __construct( $array = NULL )
	{
		if ( $array ){
			if ( is_array($array) ){
				$this->_array = $array;
			}
			else{
				throw new NonArrayException($array);
			}
		}
		else{
			$this->_array = array();
		}
	}

	/*
	 *	Iteratorインタフェース:rewidの実装
	 */
	public function rewind() {
		reset($this->_array);
	}

	/*
	 *	Iteratorインタフェース:currentの実装
	 */
	public function current() {
		$var = current($this->_array);
		return $var;
	}

	/*
	 *	Iteratorインタフェース:keyの実装
	 */
	public function key() {
		$var = key($this->_array);
		return $var;
	}

	/*
	 *	Iteratorインタフェース:nextの実装
	 */
	public function next() {
		$var = next($this->_array);
		return $var;
	}

	/*
	 *	Iteratorインタフェース:validの実装
	 */
	public function valid() {
		$var = $this->current() !== false;
		return $var;
	}

	/*
	 * プロパティの取得
	 */
	public function get( $name )
	{
		return isset($this->_array[ $name ]) ? $this->_array[ $name ] : NULL;
	}

	/*
	 * プロパティの設定
	 */
	public function set( $name, $value )
	{
		$this->_array[ $name ] = $value;
	}

	/*
	 * プロパティの取得
	 */
	public function __get( $name )
	{
		return isset($this->_array[ $name ]) ? $this->_array[ $name ] : NULL;
	}

	/*
	 * プロパティの設定
	 */
	public function __set( $name, $value )
	{
		$this->_array[ $name ] = $value;
	}

	/*
	 *	ArrayAccessインタフェース:offsetGetの実装
	 */
	public function offsetGet($offset)
	{
		return isset($this->_array[ $offset ]) ? $this->_array[ $offset ] : NULL;
	}

	/*
	 *	ArrayAccessインタフェース:offsetSetの実装
	 */
	public function offsetSet($offset, $value)
	{
		$this->_array[ $offset ] = $value;
	}

	/*
	 *	ArrayAccessインタフェース:offsetExistsの実装
	 */
	public function offsetExists($offset)
	{
		return isset($this->_array[$offset]);
	}

	/*
	 *	ArrayAccessインタフェース:offsetUnsetの実装
	 */
	public function offsetUnset($offset)
	{
		unset($this->_array[$offset]);
	}


	/*
	 * 文字列化
	 */
	public function __toString()
	{
		return '[DTO: ' . System::arrayToString( $this->_array, '&nbsp;', '' ) . ']';
	}

}
