array( 'menu_load' => array( 'callback' => 'node_load', 'arguments' => array(array('arg', 1)), 'store' => array('node'), 'transition' => array( 'menu_not_found' => FALSE, 'menu_access' => 'default', ), ), 'menu_access' => array( 'callback' => 'node_access', 'arguments' => array(array('node')), 'transition' => array( 'menu_page' => 'default', 'menu_access_denied' => FALSE, ), ), 'menu_page' => array( 'callback' => 'node_page_view', 'arguments' => array(array('node', 'nid')), 'store' => array('regions', 'content'), ), 'menu_not_found' => array( 'callback' => 'drupal_not_found', ), 'menu_access_denied' => array( 'callback' => 'drupal_not_found', ), ), ); } function arg($index, $path) { return explode('/', $path); } function node_load() { $node = new stdClass(); $node->nid = 123; return $node; } function node_access($node) { return TRUE; } function node_page_view($nid) { return 'node content'; } $path = $_GET['q'] = 'node/4'; $user = 'user object'; if ($router_item = menu_get_item($path)) { $callbacks = /* unserialize */ ($router_item['callbacks']); $callback = reset($callbacks); $context = array( 'arg' => arg(NULL, $_GET['q']), 'user' => $user, ); while ($callback) { $function = $callback['callback']; if ($callback['arguments']) { foreach ($callback['arguments'] as &$arguments) { if (!isset($arguments)) { $arguments = $context; } if (is_array($arguments)) { $value = $context; foreach ($arguments as $index) { $value = is_array($value) ? $value[$index] : $value->$index; } $arguments = $value; } } $result = call_user_func_array($function, $callback['arguments']); } else { if ($function == 'exit') { exit(); } $result = $function(); } if (isset($callback['store'])) { $store = &$context; foreach ($callback['store'] as $index) { $store = &$store[$index]; } $store = $result; unset($store); } if (isset($callback['transition'])) { unset($default); foreach ($callback['transition'] as $step => $condition) { if ($result == $condition) { $callback = $callbacks[$step]; continue 2; } if ($condition == 'default') { $default = $step; } } if (isset($default)) { $callback = $callbacks[$step]; continue; } } return $result; } }