<?php

// ochrana proti vstuput z venčí
defined('_EXEC') or die();

/**
* Smart Object
*/
class SmartObject
{
	private $data;

	/**
	 * vytvoří simple objekt
	 * @param mixed $properties vlastnosti objektu
	 */
	public function __construct($properties = null)
	{
		$this->data = new StdClass();

		if ($properties !== null)
		{
			$this->setProperties($properties);
		}
	}


	/**
	 * nastaví vlastnosti objektu
	 * @param mixed $properties vlastnosti
	 */
	public function setProperties($properties)
	{
		if (is_array($properties) || is_object($properties))
		{
			foreach ((array) $properties as $k => $v)
			{
				// Use the set function which might be overridden.
				$this->set($k, $v);
			}
			return true;
		}

		return false;
	}


	/**
	 * nastaví vlastnost parametru sobjektu a navrátí minulou hodnotu
	 * @param string $property 	vlastnost
	 * @param mixed $value    	hodnota vlastnosti
	 */
	public function set($property, $value = null)
	{
		$previous = isset($this->data->$property) ? $this->data->$property : null;
		$this->data->$property = $value;
		return $previous;
	}


	/**
	 * nastaví defaultní hodnotu vlastnosti, pokud není nastavena
	 * @param  string $property vlastnost
	 * @param  mixed $default  	defaultní hodnota vlastnosti
	 * @return mixed           	navrátí minulou hodnotu vlastnosti
	 */
	public function def($property, $default = null)
	{
		$value = $this->get($property, $default);
		return $this->set($property, $value);
	}


	/**
	 * získá hodnotu vlastnosti
	 * @param  string $property vlastnost
	 * @param  mixed $default  	standardní hodnota, pokud vlastnost není definována
	 * @return mixed           	buď hodnota vlastnosti nebo standardní hodnota
	 */
	public function get($property, $default = null)
	{
		if (isset($this->data->$property))
		{
			return $this->data->$property;
		}
		return $default;
	}


	public function getData()
	{
		return $this->data;
	}
}
?>