mockObject = NULL; $this->adhocHooks = []; } /** * Use a unit-testing mock object to handle hook invocations. * * e.g. hook_civicrm_foo === $mockObject->foo() * Mocks with a magic `__call()` method are called for every hook invokation. * * @param object $mockObject */ public function setMock($mockObject) { $this->mockObject = $mockObject; } /** * Register a function to run when invoking a specific hook. * @param string $hook * Hook name, e.g civicrm_pre. * @param array $callable * Function to call ie array(class, method). * eg. array($this, mymethod) */ public function setHook($hook, $callable) { $this->adhocHooks[$hook] = $callable; } /** * Invoke standard, mock and ad hoc hooks. * * @param int $numParams * Number of parameters to pass to the hook. * @param mixed $arg1 * Parameter to be passed to the hook. * @param mixed $arg2 * Parameter to be passed to the hook. * @param mixed $arg3 * Parameter to be passed to the hook. * @param mixed $arg4 * Parameter to be passed to the hook. * @param mixed $arg5 * Parameter to be passed to the hook. * @param mixed $arg6 * Parameter to be passed to the hook. * @param string $fnSuffix * Function suffix, this is effectively the hook name. * * @return mixed */ public function invokeViaUF( $numParams, &$arg1, &$arg2, &$arg3, &$arg4, &$arg5, &$arg6, $fnSuffix) { $params = array(&$arg1, &$arg2, &$arg3, &$arg4, &$arg5, &$arg6); $fResult1 = $fResult2 = $fResult3 = NULL; // run standard hooks if ($this->civiModules === NULL) { $this->civiModules = []; $this->requireCiviModules($this->civiModules); } $fResult1 = $this->runHooks($this->civiModules, $fnSuffix, $numParams, $arg1, $arg2, $arg3, $arg4, $arg5, $arg6); // run mock object hooks if ($this->mockObject && is_callable([$this->mockObject, $fnSuffix])) { $fResult2 = call_user_func([$this->mockObject, $fnSuffix], $arg1, $arg2, $arg3, $arg4, $arg5, $arg6); } // run adhoc hooks if (!empty($this->adhocHooks[$fnSuffix])) { $fResult3 = call_user_func_array($this->adhocHooks[$fnSuffix], $params); } $result = []; foreach ([$fResult1, $fResult2, $fResult3] as $fResult) { if (!empty($fResult) && is_array($fResult)) { $result = array_merge($result, $fResult); } } return empty($result) ? TRUE : $result; } }