code: def add_value(self, name, value_type, default=None, description=None, value=None):
          
          if description is None:
              description = name
          if value is not None and self.is_indexed and not isinstance(value, list):
              raise Exception('Indexed values must be a list')
          self.values[name] = ConfigValue(value_type, default=default, description=description, value=value)
          return self
docs: Adds a new value to this config header
          :param name: The name of the value as it would appear in a config file
          :param value_type:  The type of value: bool, str, int, float
          :param default: The value used when the config does not set any value.
          :param description: The human readable description of the value
          :param value: An optional value, if this header is indexed then the value needs to be a list.
          :return: an instance of itself so that you can chain adding values together.