@Override
    public void fill(Parameter parameter, Type type, Annotation[] annotations)
    {
        Class clazz;
        Class reader;
        if (type instanceof Class)
        {
            reader = ((Class)type);
            clazz = ((Class)type);
        }
        else if (type instanceof ParameterizedType)
        {
            reader = ((Class)((ParameterizedType)type).getRawType());
            Type[] typeArgs = ((ParameterizedType)type).getActualTypeArguments();
            if (typeArgs.length != 1)
            {
                throw new UnsupportedOperationException("Only exactly one generic Parameter Type is supported");
            }
            clazz = ((Class)typeArgs[0]);
        }
        else
        {
            throw new UnsupportedOperationException("Type is not supported: " + type);
        }

        if (reader == type && Enum.class.isAssignableFrom(clazz))
        {
            reader = Enum.class; // Use default enum reader
        }

        for (Annotation annotation : annotations)
        {
            if (annotation instanceof Reader)
            {
                reader = ((Reader)annotation).value();
            }
        }

        parameter.offer(Properties.TYPE, clazz);
        parameter.offer(Properties.READER, reader);
    }