WF_INC, 'preffix' => 'class.', 'suffix' => '.inc.php' ); $file = $config['classpath'] . '/' . $config['preffix'] . $input . $config['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 boolean True se for salvo. False caso contrário, ou $item não é um objeto * @access private */ protected function _setEntry($key, &$item) { if(!is_object($item)) return false; if(!is_array($GLOBALS['workflow'])){ $GLOBALS['workflow'] = array(); } $GLOBALS['workflow'][$key] =& $item; return true; } /** * Retorna a referência ao objeto armazenado * @param string $key Nome da classe * @return object * @access private */ protected function &_getEntry($key) { return $GLOBALS['workflow'][$key]; } /** * Verifica se uma determinada classe possui objeto armazenado no cache da Factory * @param string $key Nome da classe * @return boolean * @access protected */ protected function _isEntry($key) { return (self::_getEntry($key) !== null); } /** * Importa os arquivos da classe externa * @param string $input Nome da classe * @access private * @return void */ private function _importForeign($packageName, $className){ $config = array( 'classpath' => dirname(__FILE__)."/../../{$packageName}/inc", 'preffix' => 'class.', 'suffix' => '.inc.php' ); $file = $config['classpath'] . '/' . $config['preffix'] . $className . $config['suffix']; if (@file_exists($file)){ require_once $file; } else { trigger_error("O arquivo " . $file . " não existe.", E_USER_ERROR); } } /** * Salva um objeto externo * @params string $key Nome da classe * @params object &$item Instancia da classe * @return boolean True caso seja salvo. False caso contrário ou $item não é um objeto * @access private */ private function _setExtEntry($key, &$item) { if(!is_object($item)) return false; if(is_object($GLOBALS[$key])){ return (get_class($GLOBALS[$key]) == get_class($item)); } else { $GLOBALS[$key] =& $item; return true; } } /** * Retorna a referência ao objeto armazenado * @param string $key Nome da classe * @return object * @access private */ private function &_getExtEntry($key) { return $GLOBALS[$key]; } /** * Verifica se uma determinada classe possui objeto armazenado no cache da Factory * @param string $key Nome da classe * @return boolean * @access private */ private function _isExtEntry($key) { return (self::_getExtEntry($key) !== null); } /** * Retorna objetos armazenados ou cria novos objetos utilizando o pattern singleton * @param string $className Nome da classe * @return object * @access public */ public function &getInstance() { if (func_num_args() > 0) { $args = func_get_args(); if (self::_isEntry($args[0])) { return(self::_getEntry($args[0])); } else { $instance = call_user_func_array(array('Factory', 'newInstance'), $args); self::_setEntry($args[0], &$instance); return $instance; } } } /** * Cria os objetos sem importar o arquivo que contem a classe * @params string $className Nome da classe * @return object * @access private */ private function &_newInstance(){ if (func_num_args() > 0){ $args = func_get_args(); $className = array_shift($args); $reflectionObj = new ReflectionClass($className); return $reflectionObj->newInstanceArgs($args); } } /** * Cria novos objetos * @param string $className Nome da classe * @return object * @access public */ public function &newInstance() { if (func_num_args() > 0) { $args = func_get_args(); $className = $args[0]; self::_import($className); return call_user_func_array(array('Factory', '_newInstance'), $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 */ public function &getForeignInstance() { if (func_num_args() > 1) { $args = func_get_args(); if(self::_isExtEntry($args[1])){ return self::_getExtEntry($args[1]); } else { $packageName = array_shift($args); self::_importForeign($packageName, $args[0]); $instance = call_user_func_array(array('Factory', '_newInstance'), $args); self::_setExtEntry($args[0], &$instance); 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 */ public function &newForeignInstance() { if (func_num_args() > 1) { $args = func_get_args(); $packageName = array_shift($args); self::_importForeign($packageName, $args[0]); return call_user_func_array(array('Factory', '_newInstance'), $args); } } } ?>