def METHOD_NAME(self, data):
    """
    Vendored and modified from rest_framework/serializers.py to allow removing
    the type argument and enqueue_args before passing to the validate method.
    This means that the validate method will only be concerned with additional
    validation of the data set by the subclasses.
    """
    (is_empty_value, data) = self.validate_empty_values(data)
    if is_empty_value:
        return data
    value = self.to_internal_value(data)
    try:
        self.run_validators(value)
        value.pop("type")
        enqueue_args = value.pop("enqueue_args", {})
        value = self.validate(value)
        value["enqueue_args"] = enqueue_args
        assert value is not None, ".validate() should return the validated data"
    except (ValidationError, DjangoValidationError) as exc:
        raise ValidationError(detail=serializers.as_serializer_error(exc))
    if not isinstance(value, dict):
        raise TypeError("Validator must return a dict.")
    extra_metadata = value.get("extra_metadata", {})
    if extra_metadata is not None and not isinstance(extra_metadata, dict):
        raise TypeError("'extra_metadata' must be a dict.")
    if "user" in self.context and self.context["user"].is_authenticated:
        user = self.context["user"]
        extra_metadata.update(
            {
                "started_by": user.id,
                "started_by_username": user.username,
            }
        )
    value["extra_metadata"] = extra_metadata
    self._verify_args(value)
    self._verify_kwargs(value)
    return value