'Construct and return a new feature structure.  If this
constructor is called directly, then the returned feature
structure will be an instance of either the ``FeatDict`` class
or the ``FeatList`` class.
:param features: The initial feature values for this feature
structure:
- FeatStruct(string) -> FeatStructReader().read(string)
- FeatStruct(mapping) -> FeatDict(mapping)
- FeatStruct(sequence) -> FeatList(sequence)
- FeatStruct() -> FeatDict()
:param morefeatures: If ``features`` is a mapping or None,
then ``morefeatures`` provides additional features for the
``FeatDict`` constructor.'

def __new__(cls, features=None, **morefeatures):

    if (cls is FeatStruct):
        if (features is None):
            return FeatDict.__new__(FeatDict, **morefeatures)
        elif _is_mapping(features):
            return FeatDict.__new__(FeatDict, features, **morefeatures)
        elif morefeatures:
            raise TypeError(u'Keyword    arguments    may    only    be    specified    if    features    is    None    or    is    a    mapping.')
        if isinstance(features, string_types):
            if FeatStructReader._START_FDICT_RE.match(features):
                return FeatDict.__new__(FeatDict, features, **morefeatures)
            else:
                return FeatList.__new__(FeatList, features, **morefeatures)
        elif _is_sequence(features):
            return FeatList.__new__(FeatList, features)
        else:
            raise TypeError(u'Expected    string    or    mapping    or    sequence')
    else:
        return super(FeatStruct, cls).__new__(cls, features, **morefeatures)
