/** * Executes the transformation process. * * @throws Zend_Console_Getopt_Exception * * @return void */ public function execute() { $results = array(); $longest_name = 0; /** @var RecursiveDirectoryIterator $files */ $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(dirname(__FILE__) . '/../')); while ($files->valid()) { // skip abstract files if (!$files->isFile() || $files->getBasename() == 'Abstract.php') { $files->next(); continue; } // convert the filename to a class $class_name = 'DocBlox_Task_' . str_replace(DIRECTORY_SEPARATOR, '_', $files->getSubPath()) . '_' . $files->getBasename('.php'); // check if the class exists, if so: add it to the list if (class_exists($class_name)) { $name = $files->getBasename('.php'); $longest_name = max(strlen($name), $longest_name); $results[strtolower($files->getSubPath())][strtolower($name)] = $files->getRealPath(); } $files->next(); } // echo the list of namespaces with their tasks ksort($results, SORT_STRING); foreach ($results as $namespace => $tasks) { echo $namespace . PHP_EOL; asort($tasks, SORT_STRING); foreach ($tasks as $task => $filename) { // get the short description by reflecting the file. $refl = new DocBlox_Reflection_File($filename, false); $refl->setLogLevel(DocBlox_Core_Log::QUIET); $refl->process(); /** @var DocBlox_Reflection_Class $class */ $class = current($refl->getClasses()); echo ' :' . str_pad($task, $longest_name + 2) . $class->getDocBlock()->getShortDescription() . PHP_EOL; } } echo PHP_EOL; }
public function register($file) { if (!file_exists($file) || !is_readable($file)) { throw new Exception('The plugin file "' . $file . '" must exist and be readable'); } $reflection = new DocBlox_Reflection_File($file); $classes = $reflection->getClasses(); if (count($classes) > 1) { throw new Exception('Plugin file should only contain one class'); } /** @var DocBlox_Reflection_Class $listener_definition */ $listener_definition = reset($classes); // initialize the plugin / event listener include_once $file; $listener_name = $listener_definition->getName(); $listener = new $listener_name($this->event_dispatcher); // connect all events of the each method to the event_dispatcher foreach ($listener_definition->getMethods() as $method) { /** @var DocBlox_Reflection_Tag $event */ foreach ($method->getDocBlock()->getTagsByName('event') as $event) { $this->event_dispatcher->connect($event->getDescription(), array($listener, $method->getName())); } } }