docs: def configure_data(self, data, key_string = ''):
          """ Goes through all the options in `data`, and prompts new values.
              This function calls itself recursively if it finds an inner dictionary.
  
              Arguments:
              data -- The dictionary to loop through. 
              key_string -- The dot-notated key of the dictionary being checked through.
          """
  
          # If there's no keys in this dictionary, we have nothing to do.
          if len(data.keys()) == 0:
              return
  
          # Split the key string by its dots to find out how deep we are.
          key_parts = key_string.rsplit('.')
          prefix = '  ' * (len(key_parts) - 1)
  
          # Attempt to get a label for this key string.
          label = self.data.get_label(key_string)
  
          # If we are have any key string or label, write the header for this section.
          if label:
              p = prefix
              if len(p) > 0:
                  p += ' '
              self.prompt.header(p + '[' + label + ']')
  
          # Add to the prefix to indicate options on this level.
          prefix = prefix + '   '
  
          # If this section has an '_enabled' key, process it first, as it could enable or disable this whole section.
          if '_enabled' in data.keys():
              s = self.data.get_key_string(key_string, '_enabled')
  
              #Prompt whether to enable this section. Use the existing value as the default.
              data['_enabled'] = self.prompt.bool(prefix + self.data.get_label(s), None, data['_enabled'])
  
              # Return if this section is now disabled.
              if data['_enabled'] is False:
                  return
  
          # Loop through the rest of the dictionary and prompt for every key. If the value is a dictionary, call this function again for the next level.
          for k, v in data.iteritems():
  
              # If we hit the '_enabled' key, we've already processed it (but still need it in the dictionary for saving). Ignore it.
              if k == '_enabled':
                  continue
              
              # Get the type of the value at this key, and the dot-noted format of this key.
              t = type(v)
              s = self.data.get_key_string(key_string, k)
  
              # If the value type is a dictionary, call this function.
              if t is dict:
                  self.configure_data(v, s)
  
              # Otherwise, parse the value.
              else:
                  label = prefix + self.data.get_label(s)
                  self.parse_value(data, label, s, None, v)