how is config saved in nodeapi_example module?
There is no hook that needs to be implemented by the module for that purpose: Saving the value is automatically done by Drupal. In that case, the value for the nodeapi_example_node_type form element is saved in the nodeapi_example_node_type_&lt;CONTENT_TYPE&gt; Drupal variable, which is the variable the module accesses for the default value.

// Compare the following line...
$form['rating']['nodeapi_example_node_type'] = array(
  '#type' =&gt; 'radios',
  '#title' =&gt; t('NodeAPI Example Rating'),

  // with the following.
  '#default_value' =&gt; variable_get('nodeapi_example_node_type_' . $form['#node_type']-&gt;type, FALSE),
  '#options' =&gt; array(
    FALSE =&gt; t('Disabled'),
    TRUE =&gt; t('Enabled'),
  ),
  '#description' =&gt; t('Should this node have a rating attached to it?'),
);


Similar code is used in locale_form_node_type_form_alter().

  if (isset($form['type'])) {
    $form['workflow']['language_content_type'] = array(
      '#type' =&gt; 'radios',
      '#title' =&gt; t('Multilingual support'),

      // The variabile name is &lt;FORM_ELEMENT_NAME&gt;_&lt;CONTENT_TYPE&gt;.
      '#default_value' =&gt; variable_get('language_content_type_' . $form['#node_type']-&gt;type, 0),


      '#options' =&gt; array(t('Disabled'), t('Enabled')),
      '#description' =&gt; t('Enable multilingual support for this content type. If enabled, a language selection field will be added to the editing form, allowing you to select from one of the &lt;a href="!languages"&gt;enabled languages&lt;/a&gt;. If disabled, new posts are saved with the default language. Existing content will not be affected by changing this option.', array('!languages' =&gt; url('admin/config/regional/language'))),
    );
  }


As for the purpose of the other node hook implementations:


nodeapi_example_node_delete() is called when a node is deleted
nodeapi_example_node_insert() is called when a node is inserted in the database
nodeapi_example_node_load() is called when a node is loaded
nodeapi_example_node_update() is called when a node is updated
nodeapi_example_node_validate() is called when data entered for a node need to be validated
nodeapi_example_node_view() is called when a node is being show


Notice that hook_node_update() and hook_node_insert() are mutually exclusive: Drupal calls one or the other, but not both the hooks at the same time. The first is called when an existing node is update; the second is called when a node is created.

In your code the error is the mismatch between the form element name (followbtn_node_type) and the name of the Drupal variable you are using (followbtn_default_mode_&lt;CONTENT_TYPE&gt;). You need to change your code in one of the following ways:

$form['followbtn_rating']['followbtn_node_type'] = array(
  '#type' =&gt; 'radios',
  '#title' =&gt; t('NodeAPI Example Rating - Custom'),
  '#default_value' =&gt; variable_get('followbtn_node_type_' . $form['#node_type']-&gt;type, FALSE),
  '#options' =&gt; array(
    FALSE =&gt; t('Disabled'),
    TRUE =&gt; t('Enabled')
  ),
  '#description' =&gt; t('Should this node have a rating attached to it?'),
);




$form['followbtn_rating']['followbtn_default_mode'] = array(
  '#type' =&gt; 'radios',
  '#title' =&gt; t('NodeAPI Example Rating - Custom'),
  '#default_value' =&gt; variable_get('followbtn_default_mode_' . $form['#node_type']-&gt;type, FALSE),
  '#options' =&gt; array(
    FALSE =&gt; t('Disabled'),
    TRUE =&gt; t('Enabled')
  ),
  '#description' =&gt; t('Should this node have a rating attached to it?'),
);