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