<?php
namespace Luracast\Restler\Data;

/**
 * ValueObject base class, you may use this class to create your
 * iValueObjects quickly
 *
 * @category   Framework
 * @package    Restler
 * @author     R.Arul Kumaran <arul@luracast.com>
 * @copyright  2010 Luracast
 * @license    http://www.opensource.org/licenses/lgpl-license.php LGPL
 * @link       http://luracast.com/products/restler/
 * @version    3.0.0rc5
 */
class ValueObject implements iValueObject
{

    public function __toString()
    {
        return ' new ' . get_called_class() . '() ';
    }

    public static function __set_state(array $properties)
    {
        $class = get_called_class();
        $instance = new $class ();
        $vars = get_object_vars($instance);
        foreach ($properties as $property => $value) {
            if (property_exists($instance, $property)) {
                // see if the property is accessible
                if (array_key_exists($property, $vars)) {
                    $instance->{$property} = $value;
                } else {
                    $method = 'set' . ucfirst($property);
                    if (method_exists($instance, $method)) {
                        call_user_func(array(
                            $instance,
                            $method
                        ), $value);
                    }
                }
            }
        }
        return $instance;
    }

    public function __toArray()
    {
        $r = get_object_vars($this);
        $methods = get_class_methods($this);
        foreach ($methods as $m) {
            if (substr($m, 0, 3) == 'get') {
                $r [lcfirst(substr($m, 3))] = @$this->{$m} ();
            }
        }
        return $r;
    }

}

