<?php
/**
* デフォルトのドメインモデル実装
*
* PHP version 5
*
* @package    table_models
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/
class DefaultDomainModel extends CharcoalComponent implements IDomainModel
{
	private $_model_id;
	private $_class_name;
	private $_class_vars;
	private $_annotations;

	/*
	 *	コンストラクタ
	 */
	public function __construct( String $name = NULL )
	{
		parent::__construct(s($name));

		$this->_model_id    = NULL;
		$this->_class_name  = get_class($this);
		$this->_class_vars  = get_class_vars($this->_class_name);

		$this->_annotation_list = array();
		foreach( $this->_class_vars as $key => $var ){
			$this->_annotations[$key] = AnnotationUtil::parse( $key, $var );
		}
	}

	/**
	 * モデルIDを設定
	 */
	public function setModelID( String $model_id )
	{
		$this->_model_id = $model_id;
	}

	/**
	 * モデルIDを取得
	 */
	public function getModelID()
	{
		return $this->_model_id;
	}

	/**
	 * フィールドが存在するか
	 */
	public function fieldExists( String $field_name )
	{
		return isset($this->_class_vars[$field_name]);
	}

	/*
	 *   属性一覧を取得
	 */
	private function getAttributeList( String $name, String $value )
	{
		$result = array();

		$annotations = $this->_annotations;
		if ( $annotations ){
			foreach( $annotations as $attr => $annot_list ){
				foreach( $annot_list as $annot ){
					// 属性の条件判定
					if ( $annot->getName()->equals($name) && $annot->getValue()->equals($value) ){
						$result[] = $attr;
					}
				}
			}
		}

		return $result;
	}

	/*
	 *   フィールド一覧を取得
	 */
	public function getFieldList()
	{
		return $this->getAttributeList( s('field'), s('') );
	}

	/*
	 *   アノテーションを取得
	 */
	public function getAnnotation( String $field, String $annotation_name )
	{
		$annot_map = $this->getAnnotationMap( $field );
		if ( is_null($annot_map) || !isset($annot_map["$annotation_name"]) ){
			return NULL;
		}
		return $annot_map["$annotation_name"];
	}

	/*
	 *   指定したフィールドのアノテーションマップを取得
	 */
	public function getAnnotationMap( String $field )
	{
		if ( !isset($this->_annotations["$field"]) ){
			return NULL;
		}
		return $this->_annotations["$field"];
	}

	/*
	 *   アノテーション設定値を取得
	 */
	public function getAnnotationValue( String $field, String $annotation_name, $defaultValue = NULL )
	{
		$annot = $this->getAnnotation( $field, $annotation_name );

		return $annot ? $annot->getValue() : $defaultValue;
	}

	/*
	 *   アノテーション設定値を設定
	 */
	public function setAnnotationValue( String $field, String $annotation_name, String $value )
	{
		$annot = $this->getAnnotation( $field, $annotation_name );

		if ( $annot ){
			$annot->setValue( $value );
		}
	}

	/*
	 *   文字列化
	 */
	public function __toString()
	{
		return "[DomainModel:" . get_class($this) . "]";
	}

}

return __FILE__;