docs: def modify(self, fields=None, **fields_kwargs):
          """update the fields of this instance with the values in dict fields
  
          this should rarely be messed with, if you would like to manipulate the
          fields you should override _modify()
  
          :param fields: dict, the fields in a dict
          :param **fields_kwargs: dict, if you would like to pass the fields as key=val
              this picks those up and combines them with fields
          :returns: set, all the names of the fields that were modified
          """
          modified_fields = set()
          fields = self.make_dict(fields, fields_kwargs)
          fields = self._modify(fields)
          for field_name, field_val in fields.items():
              in_schema = field_name in self.schema.fields
              if in_schema:
                  setattr(self, field_name, field_val)
                  modified_fields.add(field_name)
  
          return modified_fields