Index: branches/5.2.x/core/kernel/utility/factory.php
===================================================================
diff -u -N -r14699 -r15130
--- branches/5.2.x/core/kernel/utility/factory.php (.../factory.php) (revision 14699)
+++ branches/5.2.x/core/kernel/utility/factory.php (.../factory.php) (revision 15130)
@@ -1,6 +1,6 @@
Files = $data['Factory.Files'];
- $this->realClasses = $data['Factory.realClasses'];
- $this->Dependencies = $data['Factory.Dependencies'];
- }
+ spl_autoload_register(Array (&$this, 'autoload'));
+ }
- /**
- * Gets object data for caching
- *
- * @access public
- * @return Array
- */
- public function getToCache()
- {
- return Array (
- 'Factory.Files' => $this->Files,
- 'Factory.realClasses' => $this->realClasses,
- 'Factory.Dependencies' => $this->Dependencies,
- );
+ /**
+ * Sets data from cache to object
+ *
+ * @param Array $data
+ * @return void
+ * @access public
+ */
+ public function setFromCache(&$data)
+ {
+ $this->Files = $data['Factory.Files'];
+ $this->realClasses = $data['Factory.realClasses'];
+ }
+
+ /**
+ * Performs automatic loading of classes registered with the factory
+ *
+ * @param string $class_name
+ * @return void
+ * @throws Exception
+ * @access public
+ */
+ public function autoload($class_name)
+ {
+ if ( !isset($this->Files[$class_name]) ) {
+ // class not from our factory -> let other autoloaders handle it
+ return;
}
- /**
- * Splits any mixing of prefix and
- * special into correct ones
- *
- * @param string $prefix_special
- * @return Array
- * @access public
- */
- function processPrefix($prefix_special)
- {
- // l.pick, l, m.test_TagProcessor
-
- //preg_match("/(.*)\.*(.*)(_*)(.*)/", $prefix_special, $regs);
- //return Array('prefix'=>$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] : '';
- $prefix_special.='.'.$special; // new2
-
- return Array('prefix'=>$prefix,'special'=>$special,'prefix_special'=>$prefix_special);
+ if ( !file_exists(FULL_PATH . $this->Files[$class_name]) ) {
+ throw new Exception('File ' . FULL_PATH . $this->Files[$class_name] . ' containing class ' . $class_name . ' definition not found');
}
+ kUtil::includeOnce(FULL_PATH . $this->Files[$class_name]);
+ }
- /**
- * Returns object using params specified, creates it if is required
- *
- * @param string $name
- * @param string $pseudo_class
- * @param Array $event_params
- * @param Array $arguments
- * @return kBase
- */
- function &getObject($name, $pseudo_class = '', $event_params = Array (), $arguments = Array ())
- {
- $name = rtrim($name, '.');
+ /**
+ * Gets object data for caching
+ *
+ * @return Array
+ * @access public
+ */
+ public function getToCache()
+ {
+ return Array (
+ 'Factory.Files' => $this->Files,
+ 'Factory.realClasses' => $this->realClasses,
+ );
+ }
- if ( isset($this->Storage[$name]) ) {
- return $this->Storage[$name];
- }
+ /**
+ * Splits any mixing of prefix and
+ * special into correct ones
+ *
+ * @param string $prefix_special
+ * @return Array
+ * @access public
+ */
+ public function processPrefix($prefix_special)
+ {
+ // l.pick, l, m.test_TagProcessor
- $ret = $this->processPrefix($name);
+ //preg_match("/(.*)\.*(.*)(_*)(.*)/", $prefix_special, $regs);
+ //return Array('prefix'=>$regs[1].$regs[3].$regs[4], 'special'=>$regs[2]);
- if (!$pseudo_class) {
- $pseudo_class = $ret['prefix'];
- }
+ $tmp = explode('_', $prefix_special, 2);
+ $tmp[0] = explode('.', $tmp[0]);
- if ( !isset($this->realClasses[$pseudo_class]) ) {
- $error_msg = 'RealClass not defined for pseudo_class ' . $pseudo_class . '';
+ $prefix = $tmp[0][0];
+ $prefix_special = $prefix; // new1
- if ( $this->Application->isInstalled() ) {
- throw new Exception($error_msg);
- }
- else {
- if ( $this->Application->isDebugMode() ) {
- $this->Application->Debugger->appendTrace();
- }
+ if ( isset($tmp[1]) ) {
+ $prefix .= '_' . $tmp[1];
+ }
- trigger_error($error_msg, E_USER_WARNING);
- }
+ $special = isset($tmp[0][1]) ? $tmp[0][1] : '';
+ $prefix_special .= '.' . $special; // new2
- $false = false;
- return $false;
- }
+ return Array ('prefix' => $prefix, 'special' => $special, 'prefix_special' => $prefix_special);
+ }
- if ( defined('DEBUG_MODE') && defined('DBG_FACTORY') && DBG_FACTORY && $this->Application->isDebugMode() ) {
- $this->Application->Debugger->appendHTML('Creating object: Pseudo class: '.$pseudo_class.' Prefix: '.$name);
- $this->Application->Debugger->appendTrace();
- }
- $this->Storage[$name] =& $this->makeClass($pseudo_class, $arguments);
- $this->Storage[$name]->Init($ret['prefix'], $ret['special']);
- $this->Application->EventManager->runBuildEvent($ret['prefix_special'], $pseudo_class, $event_params);
+ /**
+ * Returns object using params specified, creates it if is required
+ *
+ * @param string $name
+ * @param string $pseudo_class
+ * @param Array $event_params
+ * @param Array $arguments
+ * @return kBase
+ * @access public
+ */
+ public function &getObject($name, $pseudo_class = '', $event_params = Array (), $arguments = Array ())
+ {
+ $name = rtrim($name, '.');
+ if ( isset($this->Storage[$name]) ) {
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]);
+ $ret = $this->processPrefix($name);
+
+ if ( !$pseudo_class ) {
+ $pseudo_class = $ret['prefix'];
}
- /**
- * Includes file containing class
- * definition for real class name
- *
- * @param string $real_class
- * @param string $pseudo_class
- * @access private
- */
- function includeClassFile($real_class, $pseudo_class = null)
- {
- if ( class_exists($real_class) ) {
- return;
- }
+ if ( !isset($this->realClasses[$pseudo_class]) ) {
+ $error_msg = 'RealClass not defined for pseudo_class ' . $pseudo_class . '';
- if( !isset($this->Files[$real_class]) ) {
- throw new Exception('Real Class ' . $real_class . ' (for pseudo class ' . $pseudo_class . ') is not registered with the Factory');
+ if ( $this->Application->isInstalled() ) {
+ throw new Exception($error_msg);
}
+ else {
+ if ( $this->Application->isDebugMode() ) {
+ $this->Application->Debugger->appendTrace();
+ }
- if( !file_exists(FULL_PATH . $this->Files[$real_class]) ) {
- throw new Exception('Include file for class ' . $real_class . ' (' . FULL_PATH . $this->Files[$real_class] . ') does not exists');
+ trigger_error($error_msg, E_USER_WARNING);
}
- if( isset( $this->Dependencies[$real_class] ) )
- {
- foreach($this->Dependencies[$real_class] as $dep_class_name)
- {
- $this->includeClassFile($dep_class_name, $pseudo_class);
- }
- }
+ $false = false;
+ return $false;
+ }
- kUtil::includeOnce(FULL_PATH.$this->Files[$real_class]);
+ if ( defined('DEBUG_MODE') && defined('DBG_FACTORY') && DBG_FACTORY && $this->Application->isDebugMode() ) {
+ $this->Application->Debugger->appendHTML('Creating object: Pseudo class: ' . $pseudo_class . ' Prefix: ' . $name);
+ $this->Application->Debugger->appendTrace();
}
- /**
- * Get's real class name for pseudo class,
- * includes class file and creates class
- * instance.
- * All parameters except first one are passed to object constuctor
- * through mediator method makeClass that creates instance of class
- *
- * Pattern: Factory Method
- *
- * @param string $pseudo_class
- * @param Array $arguments
- * @return kBase
- * @access public
- */
- public function &makeClass($pseudo_class, $arguments = Array ())
- {
- $real_class = $this->realClasses[$pseudo_class];
+ $this->Storage[$name] =& $this->makeClass($pseudo_class, $arguments);
+ $this->Storage[$name]->Init($ret['prefix'], $ret['special']);
+ $this->Application->EventManager->runBuildEvent($ret['prefix_special'], $pseudo_class, $event_params);
- if ( !class_exists($real_class) ) {
- $this->includeClassFile($real_class, $pseudo_class);
- }
+ return $this->Storage[$name];
+ }
- $mem_before = memory_get_usage();
- $time_before = microtime(true);
+ /**
+ * Removes object from storage, so next time it could be created from scratch
+ *
+ * @param string $name Object's name in the Storage
+ * @return void
+ * @access public
+ */
+ public function DestroyObject($name)
+ {
+ unset($this->Storage[$name]);
+ }
- if ( !is_array($arguments) ) {
- // fallback for code, that doesn't know how to pass arguments
- $arguments = Array ($arguments);
- }
+ /**
+ * Checks if object with prefix passes was already created in factory
+ *
+ * @param string $name object pseudo_class, prefix
+ * @return bool
+ * @access public
+ */
+ public function hasObject($name)
+ {
+ return isset($this->Storage[$name]);
+ }
- if (!$arguments) {
- $class = new $real_class();
- }
- else {
- $reflection = new ReflectionClass($real_class);
- $class = $reflection->newInstanceArgs($arguments);
- }
+ /**
+ * Get's real class name for pseudo class,
+ * includes class file and creates class
+ * instance.
+ * All parameters except first one are passed to object constuctor
+ * through mediator method makeClass that creates instance of class
+ *
+ * Pattern: Factory Method
+ *
+ * @param string $pseudo_class
+ * @param Array $arguments
+ * @return kBase
+ * @access public
+ */
+ public function &makeClass($pseudo_class, $arguments = Array ())
+ {
+ $real_class = $this->realClasses[$pseudo_class];
- if ( defined('DEBUG_MODE') && DEBUG_MODE && defined('DBG_PROFILE_MEMORY') && DBG_PROFILE_MEMORY && $this->Application->isDebugMode() ) {
- $mem_after = memory_get_usage();
- $time_after = microtime(true);
- $mem_used = $mem_after - $mem_before;
- $time_used = $time_after - $time_before;
+ $mem_before = memory_get_usage();
+ $time_before = microtime(true);
- $this->Application->Debugger->appendHTML('Factroy created '.$real_class.' - used '.round($mem_used/1024, 3).'Kb time: '.round($time_used, 5));
- $this->Application->Debugger->profilerAddTotal('objects', null, $mem_used);
- }
+ $arguments = (array)$arguments;
- return $class;
+ if ( !$arguments ) {
+ $class = new $real_class();
}
+ else {
+ $reflection = new ReflectionClass($real_class);
+ $class = $reflection->newInstanceArgs($arguments);
+ }
- /**
- * Registers new class in the factory
- *
- * @param string $real_class Real name of class as in class declaration
- * @param string $file Filename in what $real_class is declared
- * @param string $pseudo_class Name under this class object will be accessed using getObject method
- * @param Array $dependecies List of classes required for this class functioning
- * @access public
- */
- function registerClass($real_class, $file, $pseudo_class=null, $dependecies = Array() )
- {
- if ( !isset($pseudo_class) ) {
- $pseudo_class = $real_class;
- }
+ if ( defined('DEBUG_MODE') && DEBUG_MODE && defined('DBG_PROFILE_MEMORY') && DBG_PROFILE_MEMORY && $this->Application->isDebugMode() ) {
+ $mem_after = memory_get_usage();
+ $time_after = microtime(true);
+ $mem_used = $mem_after - $mem_before;
+ $time_used = $time_after - $time_before;
- if ( !isset($this->Files[$real_class]) ) {
- $this->Files[$real_class] = preg_replace('/^'.preg_quote(FULL_PATH, '/').'/', '', $file, 1);
- }
+ $this->Application->Debugger->appendHTML('Factroy created ' . $real_class . ' - used ' . round($mem_used / 1024, 3) . 'Kb time: ' . round($time_used, 5));
+ $this->Application->Debugger->profilerAddTotal('objects', null, $mem_used);
+ }
- if ( isset($this->realClasses[$pseudo_class]) ) {
- $this->registerDependency($real_class, $pseudo_class);
- }
+ return $class;
+ }
- if ($dependecies) {
- if ( !is_array($dependecies) ) {
- $dependecies = Array ($dependecies);
- }
-
- foreach ($dependecies as $required_class) {
- $this->registerDependency($real_class, $required_class);
- }
- }
-
- $this->realClasses[$pseudo_class] = $real_class;
+ /**
+ * Registers new class in the factory
+ *
+ * @param string $real_class Real name of class as in class declaration
+ * @param string $file Filename in what $real_class is declared
+ * @param string $pseudo_class Name under this class object will be accessed using getObject method
+ * @return void
+ * @access public
+ */
+ public function registerClass($real_class, $file, $pseudo_class = null)
+ {
+ if ( !isset($pseudo_class) ) {
+ $pseudo_class = $real_class;
}
- /**
- * Unregisters existing class from factory
- *
- * @param string $real_class Real name of class as in class declaration
- * @param string $pseudo_class Name under this class object is accessed using getObject method
- */
- function unregisterClass($real_class, $pseudo_class = null)
- {
- if ( !isset($pseudo_class) ) {
- $pseudo_class = $real_class;
- }
-
- unset($this->Files[$real_class]);
-
- if ( !array_key_exists($real_class, $this->Dependencies) ) {
- return ;
- }
-
- $this->realClasses[$pseudo_class] = $this->Dependencies[$real_class][0];
- unset( $this->Dependencies[$real_class] );
+ if ( !isset($this->Files[$real_class]) ) {
+ $this->Files[$real_class] = preg_replace('/^' . preg_quote(FULL_PATH, '/') . '/', '', $file, 1);
}
- /**
- * Add $class_name to required classes list for $depended_class class.
- * All required class files are included before $depended_class file is included
- *
- * @param string $depended_class
- * @param string $class_name
- * @author Alex
- */
- function registerDependency($depended_class, $class_name)
- {
- if ($this->realClasses[$class_name] == $depended_class) {
- // same class
- return ;
- }
+ $this->realClasses[$pseudo_class] = $real_class;
+ }
- $dependencies =& $this->Dependencies[$depended_class];
- $dependency_exists = is_array($dependencies) && in_array($this->realClasses[$class_name], $dependencies);
-
- if ( !$dependency_exists ) {
- $dependencies[] = $this->realClasses[$class_name];
- }
- }
- }
\ No newline at end of file
+ /**
+ * Unregisters existing class from factory
+ *
+ * @param string $real_class Real name of class as in class declaration
+ * @param string $pseudo_class Name under this class object is accessed using getObject method
+ * @return void
+ * @access public
+ */
+ public function unregisterClass($real_class, $pseudo_class = null)
+ {
+ unset($this->Files[$real_class]);
+ }
+}
\ No newline at end of file