5 Cette classe aide a agreger des classes qui en heritent
7 une classe qui herite de empty_class peut etre vide
8 (sans attribut ni methode). une fois instanciee,
9 la fonction load_modules lui ajoute les methodes
10 qui sont definies dans d'autres classes qui heritent
13 NOTE: pour la compatibilite php4 et php5,
14 le mecanisme d'agregation est different selon
17 php4: c'est la methode aggregate qui est utilisee
19 php5: les classes contenant les nouvelles methodes
20 sont instanciees et sont enregistrées dans
21 le tableau associatif $module
23 ATTENTION: les attributs de ces classes, en php5,
24 on donc un contexte qui depend de
25 leur classe et ne sont pas accessibles
26 directement via l'instance principale
28 si ces attributs doivent etre accessible
29 via l'instance principale, il faut prevoir
39 function empty_class($root_inst){
40 if($root_inst === true) $this->root_inst = $this;
41 else $this->root_inst = $root_inst;
44 function load_modules($modules_path, $current_modules, $core_modules = null){
45 $this->_load_modules($modules_path, $current_modules, $this->root_inst, true);
46 if(isset($core_modules) && $current_modules != $core_modules){
47 $this->_load_modules($modules_path, $core_modules, $this->root_inst, true);
51 function _load_modules($modules_path, $modules_path_suffixe, $root_inst, $recursif = false){
52 if(file_exists($modules_path.$modules_path_suffixe) && $dh = opendir($modules_path.$modules_path_suffixe)){
53 while(($file = readdir($dh)) !== false){
54 if(is_dir($modules_path.$modules_path_suffixe.$file)){
55 if($recursif && substr($file, 0, 1) != "."){
56 $this->_load_modules($modules_path, $modules_path_suffixe.$file."/", $root_inst, $recursif);
59 elseif(strcasecmp(substr($file, -4), ".php") == 0){
60 $this->load($modules_path.$modules_path_suffixe.$file, $root_inst);
67 function load($module_file, $root_inst){
68 if($module_file && file_exists($module_file)){
69 $v_path = explode("/", $module_file);
70 $file = $v_path[count($v_path) - 1];
71 if(strcasecmp(substr($file, -4), ".php") == 0){
72 $class_name = substr($file, 0, -4);
73 if(!class_exists($class_name)){
74 require_once $module_file;
75 if(version_compare(PHP_VERSION, '5.0.0', '>=')){
76 if(class_exists($class_name) && !isset($this->modules[$class_name])){
77 $this->modules[$class_name] = new $class_name($root_inst);
81 if(class_exists($class_name)){
82 aggregate($this, $class_name);
90 function __call($method_name, $arguments){
91 return $this->empty_class_call($this->root_inst, $method_name, $arguments);
94 function empty_class_call($inst, $method_name, $arguments){
96 if(($module = $this->get_module_for_method($inst, $method_name)) !== false){
97 $args = ""; foreach($arguments as $i => $arg) $args .= ($args ? ", " : "")."\$arguments[".$i."]";
98 eval("\$r = \$module->".$method_name."(".$args.");");
100 else $r = $this->call_default($inst, $method_name, $arguments);
104 function get_module_for_method($inst, $method_name){
106 if(isset($inst->modules)) foreach($inst->modules as $module_name => $module_impl){
107 if(method_exists($module_impl, $method_name)){
108 $module = $module_impl;
112 $module = $this->get_module_for_method($module_impl, $method_name);
113 if($module !== false) break;
119 function call_default($inst, $method_name, $arguments){