. namespace core; /** * Hook discovery agent for core. * * @package core * @copyright Andrew Lyons * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class hooks implements \core\hook\discovery_agent { public static function discover_hooks(): array { // Describe any hard-coded hooks which can't be easily discovered by namespace. $hooks = []; $hooks = array_merge($hooks, self::discover_hooks_in_namespace('core', 'hook')); return $hooks; } public static function discover_hooks_in_namespace(string $component, string $namespace): array { $classes = \core_component::get_component_classes_in_namespace($component, $namespace); $hooks = []; foreach (array_keys($classes) as $classname) { $rc = new \ReflectionClass($classname); if ($rc->isAbstract()) { // Skip abstract classes. continue; } if (is_a($classname, \core\hook\manager::class, true)) { // Skip the manager. continue; } $hooks[$classname] = [ 'class' => $classname, 'description' => '', 'tags' => [], ]; if ($rc->implementsInterface(\core\hook\described_hook::class)) { $hooks[$classname]['description'] = $classname::get_hook_description(); } } return $hooks; } }