=== modified file 'includes/common.inc'
--- includes/common.inc	2007-12-22 23:24:24 +0000
+++ includes/common.inc	2007-12-23 09:43:37 +0000
@@ -2676,7 +2676,7 @@ function drupal_alter($type, &$data) {
  *   The rendered HTML.
  */
 function drupal_render(&$elements) {
-  if (!isset($elements) || (isset($elements['#access']) && !$elements['#access'])) {
+  if (!isset($elements) || !element_access($elements)) {
     return NULL;
   }
 
@@ -2767,6 +2767,17 @@ function drupal_render(&$elements) {
 }
 
 /**
+ * Determine whether the user has access to view or edit an array element.
+ */
+function element_access(&$element, $op = 'view') {
+  if (isset($element['#access'])) {
+    $access = $element['#access'];
+    return is_string($access) ? function_exists($access) && $access($element, $op) : $access;
+  }
+  return TRUE;
+}
+
+/**
  * Function used by uasort to sort structured arrays by weight.
  */
 function element_sort($a, $b) {

=== modified file 'includes/form.inc'
--- includes/form.inc	2007-12-22 23:24:24 +0000
+++ includes/form.inc	2007-12-23 09:35:56 +0000
@@ -840,7 +840,7 @@ function form_builder($form_id, $form, &
     }
 
     // Deny access to child elements if parent is denied.
-    if (isset($form['#access']) && !$form['#access']) {
+    if (!element_access($form, 'edit')) {
       $form[$key]['#access'] = FALSE;
     }
 
@@ -926,7 +926,7 @@ function _form_builder_handle_input_elem
 
   if (!isset($form['#value']) && !array_key_exists('#value', $form)) {
     $function = !empty($form['#value_callback']) ? $form['#value_callback'] : 'form_type_'. $form['#type'] .'_value';
-    if (($form['#programmed']) || ((!isset($form['#access']) || $form['#access']) && isset($form['#post']) && (isset($form['#post']['form_id']) && $form['#post']['form_id'] == $form_id))) {
+    if (($form['#programmed']) || (element_access($form, 'edit') && isset($form['#post']) && (isset($form['#post']['form_id']) && $form['#post']['form_id'] == $form_id))) {
       $edit = $form['#post'];
       foreach ($form['#parents'] as $parent) {
         $edit = isset($edit[$parent]) ? $edit[$parent] : NULL;

