@Override
    public T read(Object value) {
        String stringValue = String.valueOf(value);

        try {
            return Enum.valueOf(enumType, stringValue);
        } catch (IllegalArgumentException e) {
        }

        try {
            return Enum.valueOf(enumType, stringValue.toUpperCase());
        } catch (IllegalArgumentException e) {
        }

        try {
            String normalized = normalize(stringValue);

            for (T object : enumType.getEnumConstants()) {
                if (normalize(object.name()).equalsIgnoreCase(normalized)) {
                    return object;
                }
            }
            return Enum.valueOf(enumType, stringValue.toUpperCase());
        } catch (IllegalArgumentException e) {
            throw new LoaderBuilderException("EnumLoaderBuilder: Could not find '" + stringValue + "' in " +
                    enumType.getCanonicalName());
        }
    }