_cache = array(); $this->classPath = dirname(__FILE__); $this->preffix = 'class.'; $this->suffix = '.inc.php'; } /** * Importa os arquivos da classe * @param string $input Nome da classe * @access private * @return void */ private function _import($input) { $file = $this->classPath . '/' . $this->preffix . $input . $this->suffix; if (@file_exists($file)) require_once $file; else trigger_error("O arquivo " . $file . " não existe.", E_USER_ERROR); } /** * Armazena referências aos objetos recém criados * @param string $key O nome da classe * @param object &$item A instância da classe * @return void * @access private */ private function _setEntry($key, &$item) { $this->_cache[$key] = &$item; } /** * Retorna a referência ao objeto armazenado * @param string $key Nome da classe * @return object * @access private */ private function &_getEntry($key) { return $this->_cache[$key]; } /** * Verifica se uma determinada classe possui objeto armazenado no cache da Factory * @param string $key Nome da classe * @return boolean * @access public */ function isEntry($key) { return ($this->_getEntry($key) !== null); } /** * Retorna objetos armazenados ou cria novos objetos utilizando o pattern singleton * @param string $className Nome da classe * @return object * @access public */ function &getInstance() { if (func_num_args() > 0) { $args = func_get_args(); if ($this->isEntry($args[0])) { return($this->_getEntry($args[0])); } else { $instance = call_user_func_array(array(&$this, 'newInstance'), $args); $this->_setEntry($args[0], &$instance); return $instance; } } } /** * Cria novos objetos * @param string $className Nome da classe * @return object * @access public */ function &newInstance() { if (func_num_args() > 0) { $args = func_get_args(); $className = $args[0]; array_splice($args, 0, 1); $this->_import($className); $reflectionObj = new ReflectionClass($className); return $reflectionObj->newInstanceArgs($args); } } /** * Retorna objetos armazenados ou cria novos objetos utilizando o pattern singleton (somente para módulos externos) * @param string $moduleName O nome do módulo * @param string $className Nome da classe * @return object * @access public */ function &getForeignInstance() { if (func_num_args() > 1) { $args = func_get_args(); $oldClassPath = $this->classPath; $this->classPath .= '/../../' . $args[0] . '/inc'; array_splice($args, 0, 1); $instance = call_user_func_array(array(&$this, 'getInstance'), $args); $this->classPath = $oldClassPath; return $instance; } } /** * Cria novos objetos (somente para módulos externos) * @param string $moduleName O nome do módulo * @param string $className Nome da classe * @return object * @access public */ function &newForeignInstance() { if (func_num_args() > 1) { $args = func_get_args(); $oldClassPath = $this->classPath; $this->classPath .= '/../../' . $args[0] . '/inc'; array_splice($args, 0, 1); $instance = call_user_func_array(array(&$this, 'newInstance'), $args); $this->classPath = $oldClassPath; return $instance; } } } ?>