diff -rup a/compact_forms.module b/compact_forms.module
--- a/compact_forms.module	Sat Jun 30 18:14:21 2012
+++ b/compact_forms.module	Wed Dec 12 14:23:57 2012
@@ -46,113 +46,72 @@ function compact_forms_menu() {
  * Implements hook_form_alter().
  */
 function compact_forms_form_alter(&$form, $form_state, $form_id) {
-  $form['#pre_render'][] = 'compact_forms_pre_render';
-}
-
-/**
- * #pre_render callback for all forms.
- *
- * @todo Replace with #attached and move back into hook_form_alter().
- */
-function compact_forms_pre_render($form) {
-  static $css_ids, $form_ids, $loaded, $field_size, $descriptions;
-
-  // Prepare CSS form ids.
-  if (!isset($css_ids)) {
-    $css_ids = explode("\n", variable_get('compact_forms_ids', 'user-login-form'));
-    $css_ids = array_filter(array_map('trim', $css_ids));
-  }
-  // Prepare Form API form ids.
-  if (!isset($form_ids) && !empty($css_ids)) {
-    $form_ids = array();
-    foreach ($css_ids as $id) {
-      $form_ids[] = strtr($id, array('-' => '_'));
-    }
-  }
-  // Prepare form alteration settings.
-  if (!isset($field_size)) {
-    $field_size = variable_get('compact_forms_field_size', '');
-    $descriptions = variable_get('compact_forms_descriptions', 1);
-  }
-
-  if (in_array($form['form_id']['#value'], $form_ids) || (isset($form['#id']) && in_array($form['#id'], $css_ids))) {
-    // If the custom #compact_forms property has been programmatically set to
-    // FALSE, do not process this form.
-    if (isset($form['#compact_forms']) && !$form['#compact_forms']) {
-      // Also remove it from the CSS IDs being added as JS settings.
-      foreach ($css_ids as $key => $value) {
-        if ($value == $form['#id']) {
-          unset($css_ids[$key]);
-        }
-      }
-      return;
-    }
-
-    // Load our page requisites and JavaScript settings.
-    if (!isset($loaded)) {
-      _compact_forms_include_js($css_ids);
-      $loaded = TRUE;
-    }
-    // Only alter the form if a custom field size is configured or form element
-    // descriptions shall be hidden.
-    if (!empty($field_size) || !$descriptions) {
-      _compact_forms_resize_fields($form, $field_size, $descriptions);
+  $css_ids = explode("\n", variable_get('compact_forms_ids', 'user-login-form'));
+  $css_ids = array_filter(array_map('trim', $css_ids));
+  $form_css_id = str_replace('_', '-', $form_id);
+  // Check if this is a form we should work on.
+  if (in_array($form_css_id, $css_ids)) {
+    // Check if #compact_forms has been disabled in the form.
+    if (!isset($form['#compact_forms']) || $form['#compact_forms']) {
+      // Add javascript, settings and css.
+      $form['#attached']['js'][] = drupal_get_path('module', 'compact_forms') . '/compact_forms.js';
+      $form['#attached']['js'][] = array(
+        'type' => 'setting',
+        'data' => array(
+          'compactForms' => array(
+            'forms' => array($form_css_id),
+            'stars' => (int) variable_get('compact_forms_stars', 2)
+          ),
+        ),
+      );
+      $form['#attached']['css'][] = drupal_get_path('module', 'compact_forms') . '/compact_forms.css';
     }
   }
-  return $form;
 }
 
-/**
- * Helper function to recursively alter form elements.
- *
- * @todo Perform this in #after_build instead. - Or use hook_elements() to
- *   append a #process function to all supported elements.
+/*
+ * Implements hook_element_info_alter();
  */
-function _compact_forms_resize_fields(&$form, $field_size, $descriptions) {
-  if (empty($form) || !is_array($form)) {
-    return;
-  }
-  foreach (element_children($form) as $key) {
-    if (!isset($form[$key]['#type'])) {
-      continue;
-    }
-    switch ($form[$key]['#type']) {
-      case 'fieldset':
-        _compact_forms_resize_fields($form[$key], $field_size, $descriptions);
-        break;
-
-      case 'textfield':
-      case 'textarea':
-      case 'password':
-      case 'password_confirm':
-        if (!empty($field_size)) {
-          $form[$key]['#size'] = $field_size;
-        }
-        if (!$descriptions) {
-          unset($form[$key]['#description']);
-        }
-        break;
-    }
+function compact_forms_element_info_alter(&$type) {
+  // Add a process function to our supported element types.
+  $elements = array(
+    'textfield',
+    'textarea',
+    'password',
+    'password_confirm',
+  );
+  foreach ($elements as $element) {
+    $type[$element]['#process'][] = 'compact_forms_process_element';
   }
 }
 
 /**
- * Include JavaScript and CSS and attach behaviors to all selected forms.
+ * Form element processing handler for compact_forms elements.
+ *
+ * @param $element
+ *   An associative array containing the properties of the element.
  *
- * @param $css_ids
- *   An array containing CSS form ids.
+ * @return
+ *   The processed element.
  */
-function _compact_forms_include_js($css_ids) {
-  $path = drupal_get_path('module', 'compact_forms');
-  drupal_add_js($path . '/compact_forms.js');
-  drupal_add_css($path . '/compact_forms.css');
-
-  $settings = array(
-    'compactForms' => array(
-      'forms' => $css_ids,
-      'stars' => (int) variable_get('compact_forms_stars', 2),
-    ),
-  );
-  drupal_add_js($settings, 'setting');
+function compact_forms_process_element($element, &$form_state) {
+  $css_ids = explode("\n", variable_get('compact_forms_ids', 'user-login-form'));
+  $css_ids = array_filter(array_map('trim', $css_ids));
+  if (isset($form_state['build_info']['form_id'])) {
+    $form_css_id = str_replace('_', '-', $form_state['build_info']['form_id']);
+    // Check if this is a form we should work on.
+    if (in_array($form_css_id, $css_ids)) {
+      $field_size = variable_get('compact_forms_field_size', '');
+      $descriptions = variable_get('compact_forms_descriptions', 1);
+      // Change the field size if needed.
+      if (!empty($field_size)) {
+        $element['#size'] = $field_size;
+      }
+      // Remove the description if needed.
+      if (!$descriptions) {
+        unset($element['#description']);
+      }
+    }
+  }
+  return $element;
 }
-
