source: branches/1.2/workflow/inc/class.factory.inc.php @ 1349

Revision 1349, 4.7 KB checked in by niltonneto, 15 years ago (diff)

Ticket #561 - Inclusão do módulo Workflow faltante nessa versão.

  • Property svn:executable set to *
Line 
1<?php
2/**************************************************************************\
3* eGroupWare                                                               *
4* http://www.egroupware.org                                                *
5* --------------------------------------------                             *
6*  This program is free software; you can redistribute it and/or modify it *
7*  under the terms of the GNU General Public License as published by the   *
8*  Free Software Foundation; either version 2 of the License, or (at your  *
9*  option) any later version.                                              *
10\**************************************************************************/
11
12/**
13 * Implementa o design pattern factory para o módulo Workflow
14 * @author Carlos Eduardo Nogueira Gonçalves
15 * @author Sidnei Augusto Drovetto Jr. - drovetto@gmail.com
16 * @version 1.1
17 * @package Workflow
18 * @license http://www.gnu.org/copyleft/gpl.html GPL
19 */
20class Factory
21{
22        /**
23         * @var array $_cache Cache dos objetos
24         * @access private
25         */
26        private $_cache;
27
28        /**
29         * @var array $classPath Caminho de busca das classes
30         * @access protected
31         */
32        protected $classPath;
33
34        /**
35         * @var array $preffix Prefixo para o nome das classes
36         * @access protected
37         */
38        protected $preffix;
39
40        /**
41         * @var array $suffix Sufixo para o nome das classes
42         * @access protected
43         */
44        protected $suffix;
45
46        /**
47         * Construtor da classe
48         * @return object
49         * @access public
50         */
51        function Factory()
52        {
53                $this->_cache = array();
54                $this->classPath = dirname(__FILE__);
55                $this->preffix = 'class.';
56                $this->suffix = '.inc.php';
57        }
58
59        /**
60         * Importa os arquivos da classe
61         * @param string $input Nome da classe
62         * @access private
63         * @return void
64         */
65        private function _import($input)
66        {
67                $file = $this->classPath . '/' . $this->preffix . $input . $this->suffix;
68                if (@file_exists($file))
69                        require_once $file;
70                else
71                        trigger_error("O arquivo " . $file . " não existe.", E_USER_ERROR);
72        }
73
74        /**
75         * Armazena referências aos objetos recém criados
76         * @param string $key O nome da classe
77         * @param object &$item A instância da classe
78         * @return void
79         * @access private
80         */
81        private function _setEntry($key, &$item)
82        {
83                $this->_cache[$key] = &$item;
84        }
85
86        /**
87         * Retorna a referência ao objeto armazenado
88         * @param string $key Nome da classe
89         * @return object
90         * @access private
91         */
92        private function &_getEntry($key)
93        {
94                return $this->_cache[$key];
95        }
96
97        /**
98         * Verifica se uma determinada classe possui objeto armazenado no cache da Factory
99         * @param string $key Nome da classe
100         * @return boolean
101         * @access public
102         */
103        function isEntry($key)
104        {
105                return ($this->_getEntry($key) !== null);
106        }
107
108        /**
109         * Retorna objetos armazenados ou cria novos objetos utilizando o pattern singleton
110         * @param string $className Nome da classe
111         * @return object
112         * @access public
113         */
114        function &getInstance()
115        {
116                if (func_num_args() > 0)
117                {
118                        $args = func_get_args();
119                        if ($this->isEntry($args[0]))
120                        {
121                                return($this->_getEntry($args[0]));
122                        }
123                        else
124                        {
125                                $instance = call_user_func_array(array(&$this, 'newInstance'), $args);
126                                $this->_setEntry($args[0], &$instance);
127                                return $instance;
128                        }
129                }
130        }
131
132        /**
133         * Cria novos objetos
134         * @param string $className Nome da classe
135         * @return object
136         * @access public
137         */
138        function &newInstance()
139        {
140                if (func_num_args() > 0)
141                {
142                        $args = func_get_args();
143                        $className = $args[0];
144                        array_splice($args, 0, 1);
145                        $this->_import($className);
146
147                        $reflectionObj = new ReflectionClass($className);
148                        return $reflectionObj->newInstanceArgs($args);
149                }
150        }
151
152        /**
153         * Retorna objetos armazenados ou cria novos objetos utilizando o pattern singleton (somente para módulos externos)
154         * @param string $moduleName O nome do módulo
155         * @param string $className Nome da classe
156         * @return object
157         * @access public
158         */
159        function &getForeignInstance()
160        {
161                if (func_num_args() > 1)
162                {
163                        $args = func_get_args();
164
165                        $oldClassPath = $this->classPath;
166                        $this->classPath .= '/../../' . $args[0] . '/inc';
167
168                        array_splice($args, 0, 1);
169                        $instance = call_user_func_array(array(&$this, 'getInstance'), $args);
170                        $this->classPath = $oldClassPath;
171                        return $instance;
172                }
173        }
174
175        /**
176         * Cria novos objetos (somente para módulos externos)
177         * @param string $moduleName O nome do módulo
178         * @param string $className Nome da classe
179         * @return object
180         * @access public
181         */
182        function &newForeignInstance()
183        {
184                if (func_num_args() > 1)
185                {
186                        $args = func_get_args();
187
188                        $oldClassPath = $this->classPath;
189                        $this->classPath .= '/../../' . $args[0] . '/inc';
190
191                        array_splice($args, 0, 1);
192                        $instance = call_user_func_array(array(&$this, 'newInstance'), $args);
193                        $this->classPath = $oldClassPath;
194                        return $instance;
195                }
196        }
197}
198?>
Note: See TracBrowser for help on using the repository browser.