class MutableFields:
    @classmethod
    def subset_fields(cls, *fields):
        fields_in_name = [f.title().replace("_", "") for f in fields]
        name = "%s%sSubset" % (cls.__name__, "".join(fields_in_name)[:100])

        class Meta(cls.Meta):
            pass

        Meta.fields = list(fields)

        return type(name, (cls,), {"Meta": Meta})

    @classmethod
    def exclude_fields(cls, *fields):
        final_fields = []
        for field in cls.Meta.fields:
            if field not in fields:
                final_fields.append(field)

        fields_in_name = [f.title().replace("_", "") for f in final_fields]
        name = "%s%sSubset" % (cls.__name__, "".join(fields_in_name)[:100])

        class Meta(cls.Meta):
            pass

        Meta.fields = list(final_fields)

        return type(name, (cls,), {"Meta": Meta})

    @classmethod
    def extend_fields(cls, *fields):
        final_fields = list(cls.Meta.fields)
        for field in fields:
            if field not in final_fields:
                final_fields.append(field)

        fields_in_name = [f.title().replace("_", "") for f in final_fields]
        name = "%s%sSubset" % (cls.__name__, "".join(fields_in_name)[:100])

        class Meta(cls.Meta):
            pass

        Meta.fields = list(final_fields)

        return type(name, (cls,), {"Meta": Meta})
