public ExecutableElement findSetterForField(ArgumentAnnotatedField field) throws ProcessingException {

    String fieldName = field.getVariableName();
    StringBuilder builder = new StringBuilder("set");
    if (fieldName.length() == 1) {
      builder.append(fieldName.toUpperCase());
    } else {
      builder.append(Character.toUpperCase(fieldName.charAt(0)));
      builder.append(fieldName.substring(1));
    }

    String methodName = builder.toString();
    ExecutableElement setterMethod = setterMethods.get(methodName);
    if (setterMethod != null && isSetterApplicable(field, setterMethod)) {
      return setterMethod; // setter method found
    }

    // Search for setter method with hungarian notion check
    if (field.getName().length() > 1 && field.getName().matches("m[A-Z].*")) {
      // m not in lower case
      String hungarianMethodName = "set" + field.getName();
      setterMethod = setterMethods.get(hungarianMethodName);
      if (setterMethod != null && isSetterApplicable(field, setterMethod)) {
        return setterMethod; // setter method found
      }

      // M in upper case
      hungarianMethodName = "set" + Character.toUpperCase(field.getName().charAt(0)) + field.getName().substring(1);
      setterMethod = setterMethods.get(hungarianMethodName);
      if (setterMethod != null && isSetterApplicable(field, setterMethod)) {
        return setterMethod; // setter method found
      }
    }


    throw new ProcessingException(field.getElement(), "The @%s annotated field '%s' in class %s has " +
        "private or protected visibility. Hence a corresponding setter method must be provided " +
        "called '%s(%s)'. Unfortunately this is not the case. Please add a setter method for " +
        "this field!", Arg.class.getSimpleName().toString(), field.getName(), getSimpleName(), methodName,
        field.getType());

  }