Index: trunk/core/kernel/utility/factory.php =================================================================== diff -u -r4374 -r4758 --- trunk/core/kernel/utility/factory.php (.../factory.php) (revision 4374) +++ trunk/core/kernel/utility/factory.php (.../factory.php) (revision 4758) @@ -63,6 +63,7 @@ } $special= isset($tmp[0][1]) ? $tmp[0][1] : ''; $prefix_special.='.'.$special; // new2 + return Array('prefix'=>$prefix,'special'=>$special,'prefix_special'=>$prefix_special); } @@ -78,8 +79,61 @@ */ function &getObject($name,$pseudo_class='',$event_params=Array()) { + $name=rtrim($name,'.'); + if( isset($this->Storage[$name]) ) return $this->Storage[$name]; $ret=$this->processPrefix($name); if (!$pseudo_class) $pseudo_class = $ret['prefix']; + + if (!isset($this->realClasses[$pseudo_class])) + { + if( defined('DEBUG_MODE') && DEBUG_MODE ) $this->Application->Debugger->appendTrace(); + $error_level = $this->Application->isInstalled() ? E_USER_ERROR : E_USER_WARNING; + trigger_error('RealClass not defined for pseudo_class '.$pseudo_class.'', $error_level); + $false = false; + return $false; + } + + if ($this->Application->isDebugMode() && dbg_ConstOn('DBG_FACTORY')) { + global $debugger; + $debugger->appendHTML('Creating object: Pseudo class: '.$pseudo_class.' Prefix: '.$name); + $debugger->appendTrace(); + } + + $this->Storage[$name] =& $this->makeClass($pseudo_class); + $this->Storage[$name]->Init($ret['prefix'],$ret['special'],$event_params); + + $prefix=$this->Storage[$name]->Prefix; + $special=$this->Storage[$name]->Special; + +// $event_manager =& $this->Storage['EventManager']; + $event =& $this->Application->EventManager->getBuildEvent($pseudo_class); + if($event) + { + $event->Init($prefix,$special); + foreach($event_params as $param_name=>$param_value) + { + $event->setEventParam($param_name,$param_value); + } + $this->Application->HandleEvent($event); + } + + return $this->Storage[$name]; + } + + /** + * Returns object using Variable number of params specified, + * creates it if is required + * all params after 4th are passed to object constructor + * + * @param string $name + * @param string $pseudo_class + * @param Array $event_params + * @return Object + */ + function &getObjectP($name,$pseudo_class='',$event_params=Array()) + { + $ret=$this->processPrefix($name); + if (!$pseudo_class) $pseudo_class = $ret['prefix']; $name=rtrim($name,'.'); if( isset($this->Storage[$name]) ) return $this->Storage[$name]; @@ -146,9 +200,9 @@ if(!$this->Files[$real_class]) trigger_error('Real Class '.$real_class.' is not registered with the Factory', E_USER_ERROR); if(!file_exists($this->Files[$real_class])) trigger_error('Include file for class '.$real_class.' ('.$this->Files[$real_class].') does not exists', E_USER_ERROR); - if( $deps = getArrayValue($this->Dependencies, $real_class) ) + if( isset( $this->Dependencies[$real_class] ) ) { - foreach($deps as $dep_class_name) + foreach($this->Dependencies[$real_class] as $dep_class_name) { $this->includeClassFile($dep_class_name); } @@ -171,7 +225,7 @@ function &makeClass($pseudo_class) { $real_class = $this->realClasses[$pseudo_class]; - $this->includeClassFile($real_class); + if (!class_exists($real_class)) $this->includeClassFile($real_class); $mem_before = memory_get_usage(); $time_before = getmicrotime(); @@ -186,7 +240,7 @@ $pseudo_class = array_shift($func_args); $class =& ref_call_user_func_array( Array($real_class,'makeClass'), $func_args ); } - if( $this->Application->isDebugMode() && dbg_ConstOn('DBG_PROFILE_MEMORY') ) + if( defined('DEBUG_MODE') && DEBUG_MODE && dbg_ConstOn('DBG_PROFILE_MEMORY') ) { $mem_after = memory_get_usage(); $time_after = getmicrotime(); @@ -213,10 +267,10 @@ 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)) { + if (isset($this->realClasses[$pseudo_class])) { $this->registerDependency($real_class, $pseudo_class); } - + if($dependecies) { if (!is_array($dependecies)) $dependecies = array($dependecies); @@ -239,11 +293,11 @@ function registerDependency($depended_class, $class_name) { $dependencies =& $this->Dependencies[$depended_class]; - + $conditions = Array(); $conditions['exists'] = is_array($dependencies) && in_array($this->realClasses[$class_name], $dependencies); $conditions['same_class'] = $this->realClasses[$class_name] == $depended_class; - + if (!$conditions['exists'] && !$conditions['same_class']) { $dependencies[] = $this->realClasses[$class_name]; }