class ProtobufValueWriter implements ValueWriter<Builder> {
  private ModelMapper modelMapper;

  public ProtobufValueWriter(ModelMapper modelMapper) {
    this.modelMapper = modelMapper;
  }

  @Override
  public void setValue(Builder destination, Object value, String memberName) {<FILL_FUNCTION_BODY>}

  @Override
  public Member<Builder> getMember(Class<Builder> destinationType, final String memberName) {
    try {
      final Class<?> memberType = ProtobufHelper.fieldType(destinationType, memberName);
      return new Member<Builder>(memberType) {
        @Override
        public void setValue(Builder destination, Object value) {
          ProtobufValueWriter.this.setValue(destination, value, memberName);
        }
      };
    } catch (NoSuchFieldException e) {
      throw new Errors().addMessage(e, "Cannot get the member").toMappingException();
    } catch (NoSuchMethodException e) {
      throw new Errors().addMessage(e, "Cannot get the member").toMappingException();
    }
  }

  @Override
  public Collection<String> memberNames(Class<Builder> destinationType) {
    return ProtobufHelper.fields(destinationType);
  }

  @Override
  public boolean isResolveMembersSupport() {
    return true;
  }
}

    if (value == null)
      return;

    try {
      Class<? extends Builder> destinationType = destination.getClass();
      if (value instanceof Builder) {
        Method method = ProtobufHelper.setterForBuilder(destinationType, memberName);
        method.invoke(destination, value);
      } else if (value instanceof Iterable) {
        Class<?> iterableType = ProtobufHelper.iterableType(destinationType, memberName);
        Method method = ProtobufHelper.adder(destinationType, memberName);
        for (Object element : (Iterable<?>) value) {
          Object destElement = modelMapper.map(element, iterableType);
          method.invoke(destination, destElement);
        }
      } else {
        Method method = ProtobufHelper.setter(destination.getClass(), memberName);
        method.invoke(destination, value);
      }
    } catch (NoSuchMethodException e) {
      throw new Errors().addMessage(e, "Cannot set the member").toMappingException();
    } catch (IllegalAccessException e) {
      throw new Errors().addMessage(e, "Cannot set the member").toMappingException();
    } catch (InvocationTargetException e) {
      throw new Errors().addMessage(e, "Cannot set the member").toMappingException();
    }
  
<no_super_class>