docs: def validate(cls, **kwargs):
          ''' Validates the data received as keyword arguments whose name match
          this class attributes. '''
          # errors can store multiple errors
          # obj is an instance in case validation succeeds
          # redis is needed for database validation
          errors = ValidationErrors()
          obj = cls()
          redis = cls.get_redis()
  
          # Check the fields
          for fieldname, field in obj.proxy:
              if not field.fillable:
                  value = field.default
              else:
                  try:
                      value = field.validate(kwargs.get(fieldname), redis)
                  except BadField as e:
                      errors.append(e)
                      continue
  
              setattr(
                  obj,
                  fieldname,
                  value
              )
  
          # Check for custom validation rules
          for fieldname in dir(cls):
              rule = getattr(cls, fieldname)
  
              if hasattr(rule, '_is_validation_rule') and rule._is_validation_rule:
                  try:
                      rule(obj)
                  except BadField as e:
                      errors.append(e)
  
          # Trigger errors if any
          if errors.has_errors():
              raise errors
  
          # Return the object with the new data set
          return obj