code: def feature (name, values, attributes = []):
      
      __validate_feature_attributes (name, attributes)
  
      feature = Feature(name, [], attributes)
      __all_features[name] = feature
      # Temporary measure while we have not fully moved from 'gristed strings'
      __all_features["<" + name + ">"] = feature
  
      name = add_grist(name)
  
      if 'subfeature' in attributes:
          __all_subfeatures.append(name)
      else:
          __all_top_features.append(feature)
  
      extend (name, values)
  
      # FIXME: why his is needed.
      if 'free' in attributes:
          __free_features.append (name)
  
      return feature
docs: Declares a new feature with the given name, values, and attributes.
          name: the feature name
          values: a sequence of the allowable values - may be extended later with feature.extend
          attributes: a sequence of the feature's attributes (e.g. implicit, free, propagated, ...)