<?php

class Factory
{
	protected static $classes=array();
	public static function set($name, $classname, $filename=false)
	{
		//если уже установлен такой класс, то не переопределяем его
		if (isset(self::$classes[$name])) return false;
		self::overload($name, $classname, $filename);
	}
	
	//получаем значение зарегистрированное для текущего класса
	public static function get($name)
	{
		if (isset(self::$classes[$name])) return self::$classes[$name];
		return null;
	}
	
	//создаем экземпляр класса с переданными параметрами
	public static function create($name)
	{
		$args = func_get_args();
		unset($args[0]);
		
		if (!$classname=self::load($name)) die ('Класс '.$name.' не найден!');
		
		if (count($args)) {
			$reflectionObj = new ReflectionClass($classname);
			return $reflectionObj->newInstanceArgs($args);
		}

		return new $classname();
	}
	
	public static function overload($name, $classname, $filename=false)
	{
		self::$classes[$name]['name']=$classname;
		self::$classes[$name]['file']=$filename;
	}
	
	public static function load($name)
	{
		if (isset(self::$classes[$name]['name']) && self::$classes[$name]['name']) {
			$classname=self::$classes[$name]['name'];
		} elseif (strpos($name, '.')) {
			list($module, $class)=explode('.', $name);
			$classname=$module.'_'.$class;
		} else {
			$classname=$name;
		}

		if (isset(self::$classes[$name]['file']) && self::$classes[$name]['file']) {
			require_once(self::$classes[$name]['file']);
			return $classname;
		} elseif (isset($class)) {
			require_once(LAB_PATH_MODULES.'/'.$module.'/class.'.$class.'.php');
			return $classname;
		} else {
			$class = str_ireplace('_', '/', $name);
			if (file_exists(LAB_PATH_CLASSES.'/'.$class.'.php')) {
				require_once(LAB_PATH_CLASSES.'/'.$class.'.php');
				return $classname;
			}
		}

		return false;
	}
}