class ValueReaderPropertyInfo extends PropertyInfoImpl<Member> implements Accessor {
    private ValueReader.Member<Object> valueReaderMember;

    @SuppressWarnings("unchecked")
    ValueReaderPropertyInfo(ValueReader.Member<?> valueReaderMember, Class<?> initialType, String name) {
      super(initialType, null, PropertyType.GENERIC, name);
      this.valueReaderMember = (ValueReader.Member<Object>) valueReaderMember;
    }

    @Override
    public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
      return null;
    }

    @Override
    public Type getGenericType() {
      return type;
    }

    @Override
    @SuppressWarnings("unchecked")
    public Object getValue(Object subject) {
      return valueReaderMember.get(subject, name);
    }

    @Override
    public TypeInfo<?> getTypeInfo(InheritingConfiguration configuration) {
      return TypeInfoRegistry.typeInfoFor(type, configuration);
    }

    static ValueReaderPropertyInfo fromMember(final ValueReader.Member<?> valueReaderMember, String memberName) {
      if (valueReaderMember.getOrigin() != null) {
        return new ValueReaderPropertyInfo(valueReaderMember, valueReaderMember.getValueType(), memberName) {
          @Override
          public TypeInfo<?> getTypeInfo(InheritingConfiguration configuration) {
            return TypeInfoRegistry.typeInfoFor(valueReaderMember.getOrigin(),
                valueReaderMember.getValueType(), configuration);
          }
        };
      }
      return new ValueReaderPropertyInfo(valueReaderMember, valueReaderMember.getValueType(), memberName);
    }

    @SuppressWarnings("unchecked")
    static ValueReaderPropertyInfo create(final ValueReader<?> valueReader, String memberName) {<FILL_FUNCTION_BODY>}
  }

      final ValueReader<Object> uncheckedValueReader = (ValueReader<Object>) valueReader;
      ValueReader.Member<?> valueReaderMember = new ValueReader.Member<Object>(Object.class) {
        @Override
        public Object get(Object source, String memberName) {
          return uncheckedValueReader.get(source, memberName);
        }
      };
      return new ValueReaderPropertyInfo(valueReaderMember, valueReaderMember.getValueType(), memberName);
    
<no_super_class>