? 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	9 Dec 2009 17:46:40 -0000
@@ -91,11 +91,11 @@ function form_form(&$form_state, $form_b
   )));
 
   $form = array();
-  $alterations = module_invoke_all('form_info');
+  $alterations = form_get_implementations();
   foreach ($alterations 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'])) {
+  $implementations = form_get_implementations();
+  foreach ($implementations as $name => $info) {
+    if ($info['process callback']) {
       $function = $info['process callback'];
       $function($element, $form_state, $form_id, $form_elements);
     }
@@ -184,6 +185,30 @@ 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_get_implementations() {
+  static $implementations;
+
+  if (!isset($implementations)) {
+    $implementations = module_invoke_all('form_info');
+    foreach (array_keys($implementations) as $name) {
+      $info = &$implementations[$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 $implementations;
+}
+
 function form_get_value($form_state, $parents) {
   $values = $form_state['values'];
   foreach ($parents as $parent) {
