+
+ /**
+ * do_action_ref_array is the default way of calling WordPress hooks
+ * because for the most part no return value is wanted. However, this is
+ * only generally true, so using do_action_ref_array() is only called for those
+ * hooks which do not require a return value. We exclude the following, which
+ * are incompatible with the WordPress Plugin API:
+ *
+ * civicrm_upgrade
+ * http://wiki.civicrm.org/confluence/display/CRMDOC43/hook_civicrm_upgrade
+ *
+ * civicrm_caseSummary
+ * http://wiki.civicrm.org/confluence/display/CRMDOC43/hook_civicrm_caseSummary
+ *
+ * civicrm_dashboard
+ * http://wiki.civicrm.org/confluence/display/CRMDOC43/hook_civicrm_dashboard
+ */
+
+ // distinguish between types of hook
+ if (!in_array($fnSuffix, $this->hooksThatReturn)) {
+
+ // only pass the arguments that have values
+ $args = array_slice(
+ array(&$arg1, &$arg2, &$arg3, &$arg4, &$arg5, &$arg6),
+ 0,
+ $numParams
+ );
+
+ /**
+ * Use WordPress Plugins API to modify $args
+ *
+ * Because $args are passed as references to the WordPress callbacks,
+ * runHooks subsequently receives appropriately modified parameters.
+ */
+
+ // protect from REST calls
+ if (function_exists('do_action_ref_array')) {
+ do_action_ref_array($fnSuffix, $args);
+ }
+
+ }
+
+ /**
+ * The following is based on the logic of the Joomla hook file by allowing
+ * WordPress callbacks to do their stuff before runHooks gets called.
+ *
+ * It also follows the logic of the Drupal hook file by building the "module"
+ * (read "plugin") list and then calling runHooks directly. This should avoid
+ * the need for the post-processing that the Joomla hook file does.
+ *
+ * Note that hooks which require a return value are incompatible with the
+ * signature of apply_filters_ref_array and must therefore be called in
+ * global scope, like in Drupal. It's not ideal, but plugins can always route
+ * these calls to methods in their classes.
+ *
+ * At some point, those hooks could be pre-processed and called via the WordPress
+ * Plugin API, but it would change their signature and require the CiviCRM docs
+ * to be rewritten for those calls in WordPress. So it's been done this way for
+ * now. Ideally these hooks will be deprecated in favour of hooks that do not
+ * require return values.
+ */
+
+ // build list of registered plugin codes
+ $this->buildModuleList();
+
+ // Call runHooks the same way Drupal does
+ $moduleResult = $this->runHooks(
+ $this->allModules,
+ $fnSuffix,
+ $numParams,
+ $arg1, $arg2, $arg3, $arg4, $arg5, $arg6