def feature (name, values, attributes = []):
    """ 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, ...)
    """
    __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
def feature ( name , values , attributes = [ ] ) : __validate_feature_attributes ( name , attributes ) feature = Feature ( name , [ ] , attributes ) __all_features [ name ] = feature __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 ) if 'free' in attributes : __free_features . append ( name ) return feature
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, ...)