<?php
/**
* Lys
*
* GNU General Public License
*
* Copyright © 2007 - 2023, Yohann Schwan. All rights reserved.
*/
namespace Lys {
class Factory
{
/**
* @var array
*/
private static $attributes = array();
/**
* @var array
*/
private static $instances = array();
/**
* @args string $name
* @return object
*/
static function attributes()
{
return self::$attributes;
}
/**
* @args string $name
* @return object
*/
static function exists($name)
{
return isset(self::$attributes[$name]);
}
/**
* @args string $name
* @return object
*/
static function get($name)
{
if(isset(self::$instances[$name]))
{
return self::$instances[$name];
}
if(isset(self::$attributes[$name]))
{
list($c, $d, $v) = self::$attributes[$name];
foreach($d as $dk => $dv)
{
$d[$dk] = self::get($dv);
}
self::$instances[$name] = new $c($d + $v);
return self::$instances[$name];
}
throw new LogicException('(Lys\\Factory) Undefined object');
}
/**
* @args string $name, string $class, array $dependencies = array(), array $values = array()
* @return void
*/
static function set($name, $class, array $dependencies = array(), array $values = array())
{
if(isset(self::$instances[$name]))
{
throw new LogicException('(Lys\\Factory) Unable to redefine object');
}
if(isset(self::$attributes[$name]))
{
throw new LogicException('(Lys\\Factory) Unable to redefine attributes');
}
self::$attributes[$name] = array($class, $dependencies, $values);
}
}
}