0009810: Plugins architecture
[tine20] / tine20 / Tinebase / Pluggable / Abstract.php
1 <?php
2 /**
3  * Tine 2.0
4  *
5  * @package     Tinebase
6  * @subpackage  Pluggable
7  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
8  * @copyright   Copyright (c) 2007-2014 Metaways Infosystems GmbH (http://www.metaways.de)
9  * @copyright   Copyright (c) 2014 Serpro (http://www.serpro.gov.br)
10  * @author      Fl├ívio Gomes da Silva Lisboa <flavio.lisboa@serpro.gov.br>
11  *
12  */
13
14 /**
15  * Abstract class for allowing dependency injection through a plugin
16  * architecture
17  * Use the file init_plugins.php for registering plugins for a class
18  *
19  * @package Tinebase
20  * @subpackage Pluggable
21  */
22 abstract class Tinebase_Pluggable_Abstract
23 {
24
25     /**
26      * Plugins for this class family
27      * Contains:
28      * '[method]' => '[Complete_Name_Of_Class]'
29      * 
30      * @var array
31      */
32     protected static $_plugins = array();
33
34     /**
35      * Attaches a plugin
36      * Path for classes must be into include_path
37      * 
38      * @param string $method            
39      * @param string $namespace            
40      */
41     public static function attachPlugin ($method, $namespace)
42     {
43         self::$_plugins[$method] = $namespace;
44         Zend_Loader_Autoloader::getInstance()->registerNamespace(
45                 current(explode('_', $namespace)));
46     }
47
48     /**
49      * Attaches several plugins from a same path
50      * $methods must contain:
51      * '[method]' => '[Complete_Name_Of_Class]'
52      *
53      * @param array $methods            
54      * @param string $namespace            
55      */
56     public static function attachPlugins (array $methods, $namespace)
57     {
58         foreach ($methods as $method => $class) {
59             self::$_plugins[$method] = $class;
60         }
61         Zend_Loader_Autoloader::getInstance()->registerNamespace(
62                 current(explode('_', $namespace)));
63     }
64
65     /**
66      * Dependency injection
67      * Calling of plugins
68      * 
69      * @param string $method            
70      * @param array $args            
71      */
72     public function __call ($method, array $args)
73     {
74         if (isset(self::$_plugins[$method])) {
75             $class = self::$_plugins[$method];
76             $plugin = new $plugin();
77             return call_user_func_array(array(
78                     $plugin,
79                     $method
80             ), $args);
81         } else {
82             throw new Tinebase_Exception(
83                     'Plugin ' . $method . ' was not found in haystack');
84         }
85     }
86 }