Index: trunk/core/kernel/utility/factory.php
===================================================================
diff -u -r932 -r1339
--- trunk/core/kernel/utility/factory.php (.../factory.php) (revision 932)
+++ trunk/core/kernel/utility/factory.php (.../factory.php) (revision 1339)
@@ -1,8 +1,5 @@
$regs[1].$regs[3].$regs[4], 'special'=>$regs[2]);
+
$tmp=explode('_',$prefix_special,2);
$tmp[0]=explode('.',$tmp[0]);
$prefix=$tmp[0][0];
+ $prefix_special=$prefix; // new1
if( isset($tmp[1]) )
{
$prefix.='_'.$tmp[1];
}
- $special=isset($tmp[0][1])?$tmp[0][1]:'';
-
- return Array('prefix'=>$prefix,'special'=>$special);
+ $special= isset($tmp[0][1]) ? $tmp[0][1] : '';
+ $prefix_special.='.'.$special; // new2
+ return Array('prefix'=>$prefix,'special'=>$special,'prefix_special'=>$prefix_special);
}
@@ -74,7 +76,7 @@
// $name = 'l.pick', $pseudo_class = 'l'
//echo 'N: '.$name.' - P: '.$pseudo_class."\n";
$ret=$this->processPrefix($name);
- if(!$pseudo_class)$pseudo_class=$ret['prefix'];
+ if (!$pseudo_class) $pseudo_class = $ret['prefix'];
$name=rtrim($name,'.');
if( isset($this->Storage[$name]) ) return $this->Storage[$name];
@@ -83,9 +85,12 @@
$this->Application->KernelDie('RealClass not defined for pseudo_class '.$pseudo_class.'');
}
- $this->Storage[$name] =& $this->makeClass($pseudo_class);
- $this->Storage[$name]->Init($ret['prefix'],$ret['special']);
+ $funs_args = func_get_args();
+ array_splice($funs_args, 0, 3, Array($pseudo_class) );
+ $this->Storage[$name] =& call_user_func_array( Array(&$this,'makeClass'), $funs_args);
+ $this->Storage[$name]->Init($ret['prefix'],$ret['special'],$event_params);
+
$prefix=$this->Storage[$name]->Prefix;
$special=$this->Storage[$name]->Special;
@@ -104,7 +109,18 @@
return $this->Storage[$name];
}
+
/**
+ * Removes object from storage, so next time it could be created from scratch
+ *
+ * @param string $name Object's name in the Storage
+ */
+ function DestroyObject($name)
+ {
+ unset($this->Storage[$name]);
+ }
+
+ /**
* Includes file containing class
* definition for real class name
*
@@ -113,15 +129,26 @@
*/
function includeClassFile($real_class)
{
+ if (class_exists($real_class)) return;
+
if(!$this->Files[$real_class]) $this->Application->KernelDie('Fatal error: Real Class '.$real_class.' is not registered with the Factory
');
if(!file_exists($this->Files[$real_class])) $this->Application->KernelDie('Fatal error: Include file for class '.$real_class.' ('.$this->Files[$real_class].') does not exists
');
- include_once($this->Files[$real_class]);
+
+ if ( $deps = getArrayValue($this->Dependencies, $real_class) ) {
+ foreach ($deps as $filename) {
+ k4_include_once($filename);
+ }
+ }
+
+ k4_include_once($this->Files[$real_class]);
}
/**
* Get's real class name for pseudo class,
* includes class file and creates class
- * instance
+ * instance.
+ * All parameters except first one are passed to object constuctor
+ * through mediator method makeClass that creates instance of class
*
* @param string $pseudo_class
* @return Object
@@ -131,11 +158,17 @@
{
$real_class=$this->realClasses[$pseudo_class];
$this->includeClassFile($real_class);
- /*if (!class_exists($real_class))
+
+ if( func_num_args() == 1 )
{
- $this->Application->KernelDie ("Fatal error: Real Class $real_class (pseudo class $pseudo_class) not found in its registered file ".$this->Files[$pseudo_class].'
');
- }*/
- return new $real_class();
+ return new $real_class();
+ }
+ else
+ {
+ $func_args = func_get_args();
+ $pseudo_class = array_shift($func_args);
+ return call_user_func_array( Array($real_class,'makeClass'), $func_args );
+ }
}
/**
@@ -150,6 +183,11 @@
{
if(!isset($pseudo_class)) $pseudo_class = $real_class;
if(!isset($this->Files[$real_class])) $this->Files[$real_class]=$file;
+
+ if (getArrayValue($this->realClasses, $pseudo_class)) {
+ $this->Dependencies[$real_class][] = $this->Files[ $this->realClasses[$pseudo_class] ];
+ }
+
$this->realClasses[$pseudo_class]=$real_class;
}