Index: includes/menu.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/menu.inc,v
retrieving revision 1.413
diff -u -p -r1.413 menu.inc
--- includes/menu.inc	3 Oct 2010 23:29:09 -0000	1.413
+++ includes/menu.inc	4 Oct 2010 20:40:28 -0000
@@ -427,6 +427,10 @@ function menu_get_item($path = NULL, $ro
       cache_set($cid, $router_item, 'cache_menu');
     }
     if ($router_item) {
+      // Allow modules to alter the router item before it is translated and
+      // checked for access.
+      drupal_alter('menu_get_item', $router_item, $path, $original_map);
+
       $map = _menu_translate($router_item, $original_map);
       $router_item['original_map'] = $original_map;
       if ($map === FALSE) {
Index: modules/system/system.api.php
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.api.php,v
retrieving revision 1.197
diff -u -p -r1.197 system.api.php
--- modules/system/system.api.php	2 Oct 2010 01:22:41 -0000	1.197
+++ modules/system/system.api.php	4 Oct 2010 21:43:06 -0000
@@ -742,6 +742,38 @@ function hook_page_build(&$page) {
 }
 
 /**
+ * Alter a menu router item before it is translated and checked for access.
+ *
+ * This hook is invoked by menu_get_item() and allows to inspect and alter a
+ * menu router item after it has been retrieved and before it is translated and
+ * checked for access. The passed in $router_item is statically cached for the
+ * current request, so this hook is only invoked once for any router item that
+ * is retrieved via menu_get_item().
+ *
+ * Usually, modules will only want to inspect the router item and conditionally
+ * perform other actions (such as preparing a state for the current request).
+ * Note that this hook is invoked for any router item that is retrieved by
+ * menu_get_item(), so implementations should check the also passed in $path
+ * when wanting to act on the router item for the current request only.
+ *
+ * @param $router_item
+ *   The menu router item for $path.
+ * @param $path
+ *   The originally passed path, for which $router_item is responsible.
+ * @param $original_map
+ *   The path argument map, as contained in $path.
+ *
+ * @see menu_get_item()
+ */
+function hook_menu_get_item_alter(&$router_item, $path, $original_map) {
+  // When retrieving the router item for the current path...
+  if ($path == $_GET['q']) {
+    // ...call a function that prepares something for this request.
+    mymodule_prepare_something();
+  }
+}
+
+/**
  * Define menu items and page callbacks.
  *
  * This hook enables modules to register paths in order to define how URL
