1 <?php
2 
3 /**
4  * Component_Manager is the parent class of all component managers
5  * A component manager manages all components of the same types, for
6  * example, all action handlers, or all ajax handlers.
7  * @author Junling Ma <junlingm@gmail.com>
8  */
9 abstract class Doku_Component_Manager {
10     /**
11      * handles a new class that is loaded in
12      * @param string $class the name of the new class.
13      */
14     abstract protected function handle($class);
15 
16     protected function load($dir, $name='') {
17         $old_classes = array_flip(get_declared_classes());
18         $this->load_dir($dir, $name);
19         $new_classes = get_declared_classes();
20         foreach ($new_classes as $class) {
21             // check if this is an abstract class, or bultin class
22             $ref_class = new ReflectionClass($class);
23             if ($ref_class->isAbstract()) continue;
24             if ($ref_class->isInternal()) continue;
25             if (!isset($old_classes[$class])) $this->handle($class);
26         }
27     }
28 
29     private function load_dir($dir, $name) {
30         if (!is_dir($dir)) return;
31         // read the entrys of $dir one by one
32         $dh = dir($dir);
33         if ($name && strtolower(substr($name, -4)) != '.php') $name .= '.php';
34         $subdirs = array();
35         while (false !== ($entry = $dh->read())) {
36             // skip hidden files
37             if ($entry[0] == '.') continue;
38             $path = $dir . '/' . $entry;
39             if (is_dir($path)) {
40                 array_push($subdirs, $path);
41                 continue;
42             }
43 
44             if (strtolower(substr($entry, -4)) != '.php') continue;
45 
46             if (!$name || strtolower($entry) == strtolower($name))
47                 include_once($dir . '/' . $entry);
48         }
49         $dh->close();
50 
51         // load scripts in subdirs recursively
52         foreach ($subdirs as $subdir) $this->load_dir($subdir, $action);
53     }
54 }
55