/** * Register plugin hooks * * @throws RuntimeException */ private function registerHooks() { if (isset($this->config->Hooks)) { foreach (get_object_vars($this->config->Hooks) as $hookName => $hookMethod) { if ($this->packageManager->isHookRegistrationIsAllowed($hookMethod, $this->packageName, $this->pluginName)) { $hookMethodName = "hook{$hookMethod}"; $hook = new Hook($hookName, $hookMethodName, $this); if (HookManager::isHookRegistered($hook)) { throw new RuntimeException("Hook {$hookMethod} is already registered."); } if (method_exists($this, $hookMethodName)) { // Check if there is hook registered on $hookName with same method name and replace it $isReplacedHook = false; if (HookManager::isAnyHooksRegistered($hookName)) { $registeredHooks = HookManager::getRegisteredHooks($hookName); foreach ($registeredHooks as $registeredHook) { if ($registeredHook->getMethod() == $hookMethodName) { HookManager::replaceHook($registeredHook, $hook); $isReplacedHook = true; break; } } } if (!$isReplacedHook) { // Register hook if it is not replaced HookManager::registerHook($hook); } } else { throw new RuntimeException("Hook method of plugin {$this->pluginName} in package {$this->packageName} for hook {$hookName} -> {$hookMethodName} doesn't exists!"); } } } } }