? form_controller.api.php
? form_controller.css
? form_controller.js
Index: form.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/form/form.module,v
retrieving revision 1.5
diff -u -p -r1.5 form.module
--- form.module	8 Dec 2009 04:38:01 -0000	1.5
+++ form.module	10 Dec 2009 00:22:15 -0000
@@ -91,11 +91,11 @@ function form_form(&$form_state, $form_b
   )));
 
   $form = array();
-  $alterations = module_invoke_all('form_info');
-  foreach ($alterations as $name => $info) {
+  $form_info = form_info();
+  foreach ($form_info as $name => $info) {
     // Fetch configuration form.
     // @todo Take over configuration storage for most/simple implementations.
-    if (isset($info['form callback']) && function_exists($info['form callback'])) {
+    if ($info['form callback']) {
       $function = $info['form callback'];
       $settings = $function($form, $form_id, $context);
       if (isset($settings) && is_array($settings)) {
@@ -174,8 +174,9 @@ function form_process_form(&$element, $e
   $form_state['form'] = $context;
 
   // @todo Cache this.
-  foreach (module_invoke_all('form_info') as $name => $info) {
-    if (!empty($info['process callback']) && function_exists($info['process callback'])) {
+  $form_info = form_info();
+  foreach ($form_info as $name => $info) {
+    if ($info['process callback']) {
       $function = $info['process callback'];
       $function($element, $form_state, $form_id, $form_elements);
     }
@@ -184,6 +185,32 @@ function form_process_form(&$element, $e
   // return $element;
 }
 
+/**
+ * Retrieve the list of hook_form_info implementations.
+ *
+ * @todo Actually cache this info using cache_set()?
+ */
+function form_info() {
+  static $form_info;
+
+  if (!isset($form_info)) {
+    $form_info = module_invoke_all('form_info');
+    foreach (array_keys($form_info) as $name) {
+      // PHP4 does not support foreach and references, so manually reference
+      // the current element.
+      $info = &$form_info[$name];
+      if (!isset($info['process callback']) || !function_exists($info['process callback'])) {
+        $info['process callback'] = FALSE;
+      }
+      if (!isset($info['form callback']) || !function_exists($info['form callback'])) {
+        $info['form callback'] = FALSE;
+      }
+    }
+  }
+
+  return $form_info;
+}
+
 function form_get_value($form_state, $parents) {
   $values = $form_state['values'];
   foreach ($parents as $parent) {
