def METHOD_NAME(self, include=None, exclude=None, update={}):
    def to_dict(val):
        if isinstance(val, list):
            return [to_dict(v) for v in val]
        elif isinstance(val, dict):
            return {to_dict(k): to_dict(v) for k, v in val.items()}
        elif isinstance(val, (BaseModel, Dict)):
            return val.dict(
                exclude_unset=True,
                exclude_defaults=True)
        elif isinstance(val, List):
            return val.dict(
                exclude_unset=True,
                exclude_defaults=True)['__root__']
        else:
            return val
    ctx = self.parent if _ctx.get() is None else _ctx.get()
    v = {
        **self.dict(
            exclude_unset=True,
            exclude_defaults=True,
            include=include,
            exclude=exclude),
        **{
            k: to_dict(v)
            for k, v
            in update.items()
        }
    }
    with set_context(ctx):
        return self.__class__(**v)