Index: modules/system/system.api.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.api.php,v
retrieving revision 1.118
diff -u -r1.118 system.api.php
--- modules/system/system.api.php	9 Jan 2010 23:03:21 -0000	1.118
+++ modules/system/system.api.php	12 Jan 2010 23:07:11 -0000
@@ -19,6 +19,7 @@
  * a hook may then place their implementation in either $module.module or in
  * $module.$group.inc. If the hook is located in $module.$group.inc, then that
  * file will be automatically loaded when needed.
+ *
  * In general, hooks that are rarely invoked and/or are very large should be
  * placed in a separate include file, while hooks that are very short or very
  * frequently called should be left in the main module file so that they are
@@ -31,9 +32,10 @@
  *     system will determine whether a file with the name $module.$group.inc
  *     exists, and automatically load it when required.
  *
- * See system_hook_info() for all hook groups defined by Drupal core.
+ * See system_hooks_info() for all hook groups defined by Drupal core.
+ * @see hook_hooks_info_alter()
  */
-function hook_hook_info() {
+function hook_hooks_info() {
   $hooks['token_info'] = array(
     'group' => 'tokens',
   );
@@ -44,6 +46,15 @@
 }
 
 /**
+ * Allows modules to alter the information returned by hook_hooks_info().
+ */
+function hook_hooks_info_alter(&$hook_info) {
+  $hook_info['myhook'] = array(
+    'group' => 'newgroupname',
+  );
+}
+
+/**
  * Inform the base system and the Field API about one or more entity types.
  *
  * Inform the system about one or more entity types (i.e., object types that
Index: modules/system/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.module,v
retrieving revision 1.873
diff -u -r1.873 system.module
--- modules/system/system.module	10 Jan 2010 00:09:37 -0000	1.873
+++ modules/system/system.module	12 Jan 2010 23:07:11 -0000
@@ -258,9 +258,9 @@
 }
 
 /**
- * Implements hook_hook_info().
+ * Implements hook_hooks_info().
  */
-function system_hook_info() {
+function system_hooks_info() {
   $hooks['token_info'] = array(
     'group' => 'tokens',
   );
Index: includes/module.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/module.inc,v
retrieving revision 1.178
diff -u -r1.178 module.inc
--- includes/module.inc	7 Jan 2010 04:54:18 -0000	1.178
+++ includes/module.inc	12 Jan 2010 23:07:11 -0000
@@ -471,7 +471,7 @@
     cache_set('module_implements', array(), 'cache_bootstrap');
     drupal_static_reset('module_hook_info');
     drupal_static_reset('drupal_alter');
-    cache_clear_all('hook_info', 'cache_bootstrap');
+    cache_clear_all('hooks_info', 'cache_bootstrap');
     return;
   }
 
@@ -522,7 +522,10 @@
 }
 
 /**
- * Retrieve a list of what hooks are explicitly declared.
+ * Retrieves a list of what hooks are explicitly declared.
+ *
+ * This list is built from invoking hook_hooks_info() and
+ * hook_hooks_info_alter().
  */
 function module_hook_info() {
   $hook_info = &drupal_static(__FUNCTION__, array());
@@ -534,7 +537,7 @@
       // We can't use module_invoke_all() here or it would cause an infinite
       // loop.
       foreach (module_list() as $module) {
-        $function = $module . '_hook_info';
+        $function = $module . '_hooks_info';
         if (function_exists($function)) {
           $result = $function();
           if (isset($result) && is_array($result)) {
@@ -544,7 +547,7 @@
       }
       // We can't use drupal_alter() for the same reason as above.
       foreach (module_list() as $module) {
-        $function = $module . '_hook_info_alter';
+        $function = $module . '_hooks_info_alter';
         if (function_exists($function)) {
           $function($hook_info);
         }
