private function decodeConstructorParamValue(
        ReflectionParameter $constructorParam,
        $constructorParamValue,
        ReflectionClass $reflectionClass,
        string $normalizedHashPropertyName,
        EncodingContext $context
    ) {
        if ($constructorParam->hasType() && !$constructorParam->isArray() && !$constructorParam->isVariadic()) {
            $constructorParamType = (string)$constructorParam->getType();

            return $this->encoders->getEncoderForType($constructorParamType)
                ->decode($constructorParamValue, $constructorParamType, $context);
        }

        if ($constructorParam->isVariadic() || $constructorParam->isArray()) {
            return $this->decodeArrayOrVariadicConstructorParamValue(
                $constructorParam,
                $constructorParamValue,
                $context
            );
        }

        $decodedValue = null;

        if (
        $this->tryDecodeValueFromGetterType(
            $reflectionClass,
            $normalizedHashPropertyName,
            $constructorParamValue,
            $context,
            $decodedValue
        )
        ) {
            return $decodedValue;
        }

        // At this point, let's just check if the value we're trying to decode is a scalar, and if so, just return it
        if (is_scalar($constructorParamValue)) {
            $type = gettype($constructorParamValue);

            return $this->encoders->getEncoderForType($type)
                ->decode($constructorParamValue, $type, $context);
        }

        throw new EncodingException("Failed to decode constructor parameter {$constructorParam->getName()}");
    }