Index: cck_select_other.api.php
===================================================================
RCS file: cck_select_other.api.php
diff -N cck_select_other.api.php
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ cck_select_other.api.php	16 Nov 2010 15:52:20 -0000
@@ -0,0 +1,56 @@
+<?php
+//$Id$
+/**
+ * @file
+ * CCK Select Other API Documentation
+ */
+
+
+/**
+ * Alter CCK Select Other widget details
+ * @param $info The widget $info array.
+ * @return A new widget $info array. Hopefully just an addition onto the current one.
+ */
+function hook_cck_select_other_info_alter($info) {
+  // Add a field type to $info and return it.
+  $info['field types'][] = 'content_taxonomy';
+  return $info;
+}
+
+/**
+ * Add additional options to the CCK Select Other widget.
+ * @param $field The field array
+ * @param $options The default options
+ * @return An associative array where each element is an array of options to be merged.
+ */
+function hook_cck_select_other_options($field, $options) {
+  if ($field['module'] == 'content_taxonomy']) {
+    // Create some more options.
+    $options = array(
+      'key' => array(
+        'value' => t('Value'),
+      ),
+    );
+
+    return $options;
+  }
+}
+
+/**
+ * Do additional processing or modify the value to be saved.
+ * @param $field The field array
+ * @param $edit The full edit array. Useful to grab select_other_list and select_other_text_input values.
+ * @return NULL if not modifying the value. Otherwise, return the value to be saved.
+ */
+function hook_cck_select_other_options($field, $edit) {
+  if ($edit['select_other_list'] == 'other' && $field['module'] == 'content_taxonomy') {
+    // Do somethig like save the actual value as a taxonomy term and return the tid to save.
+    $term = array(
+      'tid' => NULL,
+      'vid' => $field['vid'], // Vocabulary id based on Content Taxonomy Field settings.
+      'name' => $edit['select_other_text_input'],
+    );
+    taxonomy_save_term($term);
+    return $term['tid'];
+  }
+}
Index: cck_select_other.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/cck_select_other/cck_select_other.module,v
retrieving revision 1.1.2.16
diff -u -p -r1.1.2.16 cck_select_other.module
--- cck_select_other.module	5 Nov 2010 19:59:57 -0000	1.1.2.16
+++ cck_select_other.module	16 Nov 2010 15:52:21 -0000
@@ -12,7 +12,7 @@
  */
 function cck_select_other_widget_info() {
 
-  return array(
+  $info = array(
     'cck_select_other' => array(
       'label' => t('Select other list'),
       'field types' => array('text', 'number_integer', 'number_decimal', 'number_float'),
@@ -22,6 +22,13 @@ function cck_select_other_widget_info() 
       ),
     ),
   );
+
+  $alter = module_invoke_all('cck_select_other_info_alter', $info);
+  if (!empty($alter)) {
+    $info = $alter;
+  }
+
+  return $info;
 }
 
 /**
@@ -141,11 +148,29 @@ function cck_select_other_process($eleme
     $element['#value'] = array(array('value' => $edit['select_other_text_input']));
     $form_state['values'][$field_name] = $element['#value'][$delta];
     $form_state['clicked_button']['#post'][$field_name] = $element['#value'][$delta];
+    $values = module_invoke_all('cck_select_other_process', $field, $edit);
+    
+    // @todo This is FIFO
+    foreach ($values as $val) {
+      if (isset($val)) {
+        $element['#value'] = array(array('value' => $val));
+        $edit['select_other_text_input'] = $val;
+      }
+    }
   }
   elseif (!empty($edit)) {
     $element['#value'] = array(array('value' => $edit['select_other_list']));
     $form_state['values'][$field_name] = $element['#value'][$delta];
     $form_state['clicked_button']['#post'][$field_name] = $element['#value'][$delta];
+    $values = module_invoke_all('cck_select_other_process', $field, $edit);
+
+    // @todo This is FIFO
+    foreach ($values as $val) {
+      if (isset($val)) {
+        $element['#value'] = array(array('value' => $val));
+        $edit['select_other_list'] = $val;
+      }
+    }
   }
   else {
     $element['#value'] = '';
@@ -194,9 +219,18 @@ function cck_select_other_options($field
       $options[$key] = t('!option', array('!option' => $option));
     }
   }
+
+  $hook_options = module_invoke_all('cck_select_other_options', $field, $options);
+
   if (!isset($options['other'])) {
     $options['other'] = t('Other');
   }
+  foreach ($hook_options as $opts) {
+    foreach ($opts as $key => $opt) {
+      $options[$key] = $opt;
+    }
+  }
+
   return $options;
 }
 
