diff --git a/core/lib/Drupal/Core/Extension/CachedModuleHandler.php b/core/lib/Drupal/Core/Extension/CachedModuleHandler.php
index a3f3eac..0e98472 100644
--- a/core/lib/Drupal/Core/Extension/CachedModuleHandler.php
+++ b/core/lib/Drupal/Core/Extension/CachedModuleHandler.php
@@ -64,6 +64,30 @@ public function getBootstrapModules() {
   }
 
   /**
+   * Overrides \Drupal\Core\Extension\ModuleHandler::getHookInfo().
+   */
+  public function getHookInfo() {
+    // When this function is indirectly invoked from bootstrap_invoke_all() prior
+    // to all modules being loaded, we do not want to cache an incomplete
+    // hook_hookInfo() result, so instead return an empty array. This requires
+    // bootstrap hook implementations to reside in the .module file, which is
+    // optimal for performance anyway.
+    if (!$this->loaded) {
+      return array();
+    }
+    if (!isset($this->hookInfo)) {
+      if ($cache = $this->bootstrapCache->get('hook_info')) {
+        $this->hookInfo = $cache->data;
+      }
+      else {
+        $this->hookInfo = parent::getHookInfo();
+        $this->bootstrapCache->set('hook_info', $this->hookInfo);
+      }
+    }
+    return $this->hookInfo;
+  }
+
+  /**
    * Implements \Drupal\Core\Extension\ModuleHandlerInterface::resetImplementations().
    */
   public function resetImplementations() {
@@ -129,30 +153,6 @@ protected function getImplementationInfo($hook) {
   }
 
   /**
-   * Overrides \Drupal\Core\Extension\ModuleHandler::getHookInfo().
-   */
-  protected function getHookInfo() {
-    // When this function is indirectly invoked from bootstrap_invoke_all() prior
-    // to all modules being loaded, we do not want to cache an incomplete
-    // hook_hookInfo() result, so instead return an empty array. This requires
-    // bootstrap hook implementations to reside in the .module file, which is
-    // optimal for performance anyway.
-    if (!$this->loaded) {
-      return array();
-    }
-    if (!isset($this->hookInfo)) {
-      if ($cache = $this->bootstrapCache->get('hook_info')) {
-        $this->hookInfo = $cache->data;
-      }
-      else {
-        $this->hookInfo = parent::getHookInfo();
-        $this->bootstrapCache->set('hook_info', $this->hookInfo);
-      }
-    }
-    return $this->hookInfo;
-  }
-
-  /**
    * Retrieves hook implementation info from the cache.
    */
   protected function getCachedImplementationInfo() {
diff --git a/core/lib/Drupal/Core/Extension/ModuleHandler.php b/core/lib/Drupal/Core/Extension/ModuleHandler.php
index 14b4e72..7e1e790 100644
--- a/core/lib/Drupal/Core/Extension/ModuleHandler.php
+++ b/core/lib/Drupal/Core/Extension/ModuleHandler.php
@@ -222,6 +222,35 @@ public function loadInclude($module, $type, $name = NULL) {
   }
 
   /**
+   * Implements \Drupal\Core\Extension\ModuleHandlerInterface::getHookInfo().
+   */
+  public function getHookInfo() {
+    if (isset($this->hookInfo)) {
+      return $this->hookInfo;
+    }
+    $this->hookInfo = array();
+    // We can't use $this->invokeAll() here or it would cause an infinite
+    // loop.
+    foreach ($this->moduleList as $module => $filename) {
+      $function = $module . '_hook_info';
+      if (function_exists($function)) {
+        $result = $function();
+        if (isset($result) && is_array($result)) {
+          $this->hookInfo = NestedArray::mergeDeep($this->hookInfo, $result);
+        }
+      }
+    }
+    // We can't use $this->alter() for the same reason as above.
+    foreach ($this->moduleList as $module => $filename) {
+      $function = $module . '_hook_info_alter';
+      if (function_exists($function)) {
+        $function($this->hookInfo);
+      }
+    }
+    return $this->hookInfo;
+  }
+
+  /**
    * Implements \Drupal\Core\Extension\ModuleHandlerInterface::getImplementations().
    */
   public function getImplementations($hook) {
@@ -438,42 +467,6 @@ protected function getImplementationInfo($hook) {
   }
 
   /**
-   * Retrieves a list of hooks that are declared through hook_hook_info().
-   *
-   * @return
-   *   An associative array whose keys are hook names and whose values are an
-   *   associative array containing a group name. The structure of the array
-   *   is the same as the return value of hook_hook_info().
-   *
-   * @see hook_hook_info()
-   */
-  protected function getHookInfo() {
-    if ($this->hookInfo) {
-      return $this->hookInfo;
-    }
-    $this->hookInfo = array();
-    // We can't use $this->invokeAll() here or it would cause an infinite
-    // loop.
-    foreach ($this->moduleList as $module => $filename) {
-      $function = $module . '_hook_info';
-      if (function_exists($function)) {
-        $result = $function();
-        if (isset($result) && is_array($result)) {
-          $this->hookInfo = NestedArray::mergeDeep($this->hookInfo, $result);
-        }
-      }
-    }
-    // We can't use $this->alter() for the same reason as above.
-    foreach ($this->moduleList as $module => $filename) {
-      $function = $module . '_hook_info_alter';
-      if (function_exists($function)) {
-        $function($this->hookInfo);
-      }
-    }
-    return $this->hookInfo;
-  }
-
-  /**
    * Parses a dependency for comparison by drupal_check_incompatibility().
    *
    * @param $dependency
diff --git a/core/lib/Drupal/Core/Extension/ModuleHandlerInterface.php b/core/lib/Drupal/Core/Extension/ModuleHandlerInterface.php
index 4fb9c8c..71c5dd9 100644
--- a/core/lib/Drupal/Core/Extension/ModuleHandlerInterface.php
+++ b/core/lib/Drupal/Core/Extension/ModuleHandlerInterface.php
@@ -141,6 +141,18 @@ public function loadAllIncludes($type, $name = NULL);
   public function loadInclude($module, $type, $name = NULL);
 
   /**
+   * Retrieves a list of hooks that are declared through hook_hook_info().
+   *
+   * @return array
+   *   An associative array whose keys are hook names and whose values are an
+   *   associative array containing a group name. The structure of the array
+   *   is the same as the return value of hook_hook_info().
+   *
+   * @see hook_hook_info()
+   */
+  public function getHookInfo();
+
+  /**
    * Determines which modules are implementing a hook.
    *
    * @param string $hook
