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; }