<?

$classes_file = file(_ADMIN_DIR."classes.ini");

foreach($classes_file as $line) {

      $line = trim($line);
      if ($line != '' && strpos($line,'#') === false) {

        	list($class, $file, $parent) = explode(":", $line);

        	$classes_lst[$class] = array();
        	$classes_lst[$class]["name"] = $class;
        	$classes_lst[$class]["file"] = _ADMIN_DIR.$file;
        	$classes_lst[$class]["parent"] = $parent;
      }
}


foreach($classes_lst as $class) {
	$classes_lst[$class["name"]]["history"] = array();
	$classes_lst[$class["name"]]["history"][] = $class["name"];
	$parent = $classes_lst[$class["name"]]["parent"]; 
	for(;isset($classes_lst[$parent]);) {
		$classes_lst[$class["name"]]["history"][] = $parent;
		$parent = $classes_lst[$parent]["parent"];
		}
	}

//echo "<PRE>";print_r($classes_lst);die;

unset($classes_file);

# возвращает результат вызова статического метода класса
function call_static_method() {

	global $classes_lst;

	$param_list = func_get_args();
	$class = array_shift($param_list);
 	$method = array_shift($param_list);
	$class = strtolower($class);	
	if(empty($classes_lst[$class]))
		die("Error :: Class factory :: class [$class] not found.");


	if (!class_exists($class)) {
  	### делаем require только когда класс не виден
		for($i=count($classes_lst[$class]["history"])-1; $i>=0; $i--) 
			require_once($classes_lst[$classes_lst[$class]["history"][$i]]["file"]);
	}

  return call_user_func_array(array($class, $method),$param_list);
}

function func_new() {
    global $classes_lst;

    // сколько угодно параметров можно передать конструктору класса
    $param_list = func_get_args();
    $class = array_shift($param_list);

    $class = strtolower($class);	
 

    if(empty($classes_lst[$class])){
        die("Error :: Class factory :: class [$class] not found.");
    }

    if (!class_exists($class)) {
    ### делаем require только когда класс не виден
        for($i=count($classes_lst[$class]["history"])-1; $i>=0; $i--) {
            $class_file = $classes_lst[$classes_lst[$class]["history"][$i]]["file"];
            if(!file_exists($class_file)) {
                die("Error :: Class factory :: class file [$class_file] for class [$class] not found.");                
            }
            require_once($classes_lst[$classes_lst[$class]["history"][$i]]["file"]);
            }
    }

 
    $obj = new $class;
    call_user_func_array(array(&$obj, 'constructor'), &$param_list);

    return $obj;
}

function func_new_once() {
	global $classes_lst;

	// сколько угодно параметров можно передать конструктору класса
	$param_list = func_get_args();
	$class = array_shift($param_list);

	$class = strtolower($class);	
	if(empty($classes_lst[$class]))
		die("Error :: Class factory :: class [$class] not found.");

	if (!class_exists($class)) {
	  ### делаем require только когда класс не виден
		for($i=count($classes_lst[$class]["history"])-1; $i>=0; $i--) 
			require_once($classes_lst[$classes_lst[$class]["history"][$i]]["file"]);
	}

	// возвращает экземпляр объекта, если он есть
  return call_user_func_array(array($class, 'get_instance'),$param_list);
}



 


?>