def __init__(self, identifier, datatype, default=None, optional=True, mutable=True):
        if _debug:
            Property._debug("__init__ %s %s default=%r optional=%r mutable=%r",
                identifier, datatype, default, optional, mutable
                )

        # keep the arguments
        self.identifier = identifier

        # check the datatype
        self.datatype = datatype
        if not issubclass(datatype, (Atomic, Sequence, Choice, Array, List, AnyAtomic)):
            raise TypeError("invalid datatype for property: %s" % (identifier,))

        self.optional = optional
        self.mutable = mutable
        self.default = default