Index: includes/menu.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/menu.inc,v
retrieving revision 1.312
diff -u -p -r1.312 menu.inc
--- includes/menu.inc	9 Feb 2009 16:27:35 -0000	1.312
+++ includes/menu.inc	7 Mar 2009 19:34:22 -0000
@@ -113,6 +113,11 @@ define('MENU_CREATED_BY_ADMIN', 0x0040);
 define('MENU_IS_LOCAL_TASK', 0x0080);
 
 /**
+ * Internal menu flag -- menu item is the root of the menu tree.
+ */
+define('MENU_FINISH_ROUTING', FALSE);
+
+/**
  * @} End of "Menu flags".
  */
 
@@ -380,11 +385,24 @@ function menu_get_item($path = NULL, $ro
     }
     $router_items[$path] = $router_item;
   }
+  $router_items[$path]['page_callbacks'] = array($router_items[$path]['page_callback']);
   return $router_items[$path];
 }
 
 /**
- * Execute the page callback associated with the current path
+ * Let modules add to the page's $context.
+ */
+function menu_get_context($router_item) {
+  $context = array();
+  foreach (module_implements('context') as $module) {
+    $function = $module . '_context';
+    $function($context, $router_item);
+  }
+  return $context;
+}
+
+/**
+ * Execute the page callbacks associated with the current path
  */
 function menu_execute_active_handler($path = NULL) {
   if (_menu_site_is_offline()) {
@@ -396,10 +414,18 @@ function menu_execute_active_handler($pa
     menu_rebuild();
   }
   if ($router_item = menu_get_item($path)) {
+    $page = array();
+    $context = menu_get_context($router_item);
     if ($router_item['access']) {
-      if (drupal_function_exists($router_item['page_callback'])) {
-        return call_user_func_array($router_item['page_callback'], $router_item['page_arguments']);
+      foreach ($router_item['page_callbacks'] as $page_callback) {
+        if (drupal_function_exists($page_callback)) {
+          $return = $page_callback($page, $context);
+          if ($return === MENU_FINISH_ROUTING) {
+            break;
+          }
+        }
       }
+      return $page;
     }
     else {
       return MENU_ACCESS_DENIED;
Index: modules/node/node.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/node/node.module,v
retrieving revision 1.1027
diff -u -p -r1.1027 node.module
--- modules/node/node.module	26 Feb 2009 07:30:27 -0000	1.1027
+++ modules/node/node.module	7 Mar 2009 19:34:22 -0000
@@ -2070,9 +2070,9 @@ function node_page_default() {
 /**
  * Menu callback; view a single node.
  */
-function node_page_view($node) {
-  drupal_set_title($node->title);
-  return node_show($node);
+function node_page_view(&$page, $context) {
+  drupal_set_title($context['node']->title);
+  return node_show($context['node']);
 }
 
 /**
