docs: public <Solution> Collection<Variable<Solution, ?>> createFromGettersAndSetters(
  			Class<Solution> solutionClass) {
  		Map<String, Method> getters = new HashMap<>();
  		Map<String, Method> setters = new HashMap<>();
  		for (Method method : solutionClass.getMethods()) {
  			if (isGetter(method)) {
  				String name = method.getName().substring(3);
  				getters.put(name, method);
  			} else if (isSetter(method)) {
  				String name = method.getName().substring(3);
  				setters.put(name, method);
  			} else {
  				// not a getter/setter, ignore it
  			}
  		}
  
  		getters.keySet().retainAll(setters.keySet());
  		setters.keySet().retainAll(getters.keySet());
  		for (String name : getters.keySet()) {
  			Method getter = getters.get(name);
  			Method setter = setters.get(name);
  			if (getter.getReturnType().equals(setter.getParameterTypes()[0])) {
  				// setter and getter are compatible
  			} else {
  				getters.remove(name);
  				setters.remove(name);
  			}
  		}
  
  		Collection<Variable<Solution, ?>> variables = new LinkedList<>();
  		for (Entry<String, Method> entry : getters.entrySet()) {
  			String name = entry.getKey();
  			Method getter = entry.getValue();
  			variables.add(createVariableOn(solutionClass, getter, name,
  					getter.getReturnType()));
  		}
  		return variables;
  	}