private <T, R> Pair<ConvertType, TypeConverter<T, R>> getConvertInfo(T instance, Class<R> targetClass) {
		boolean isNull = (instance == null);

		if (instance != null && (targetClass.equals(instance.getClass()) || targetClass.isAssignableFrom(instance.getClass()))) {
			return new Pair(ConvertType.identity, null);
		}

		Class sourceClass = (isNull) ? null : instance.getClass();
		if (!isNull) {
			TypeConverter typeConverter = converterRegistry.resolveTypeConverter(sourceClass, targetClass);
			if (typeConverter != null) {
				return new Pair(ConvertType.converter, typeConverter);
			}
		}

		// now, if no type converters and if instance is null, then, the none convert type will be applied
		if (instance == null) {
			return new Pair(ConvertType.none, null);
		}

		return new Pair(ConvertType.complex, null);
	}