<?php
/*
* @package LabCMS
* @copyright (c) 2006 Alexander Levin aka Loki (loki_angel@mail.ru)
* @support http://labcms.ru
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*/

abstract class Entity
{
	protected $_data=array();

	public function __construct($data=null)
	{
		if ($data) $this->set($data);
	}
	
	public function getArray()
	{
        $result = array();
        foreach ($this->_data as $key => $val) {
            if (is_object($val) && $val instanceOf Entity) {
                $result[$key] = $val->getArray();
            } else {
                $result[$key] = $val;
            }
        }
        return $result;
	}
	
	public function getFilteredKeys($filter=array())
	{
		$result=array();
		foreach ($filter as $key) {
			if (isset($this->$key)) $result[$key]=$this->$key;
		}
		return $result;
	}
	
	public function __set($key, $value)
	{
		$this->_data[$key]=$value;
	}
	
	// ссылка нужна для корректной работы с массивами вида $this->arr['key']
	public function &__get($key)
	{
		if (array_key_exists($key, $this->_data)) {
			return $this->_data[$key];
		} else {
			//эта конструкция тут потому, что метод по ссылке может возвращать только переменную
			$null=null;
			return $null;
		}
	}
	
	public function set($data)
	{
		foreach ($data as $k=>$v) {
			$this->$k=$v;
		}
	}
	
	// ссылка нужна для корректной работы с массивами вида $this->arr['key']
	public function &__isset($key)
	{
		//по ссылке может быть возвращена только переменная
		$result=array_key_exists($key, $this->_data);
		return $result;
	}
}