code: public Object invokeVisit(Object visitor, Object argument) {
  		Assert.notNull(visitor, "The visitor to visit is required");
  		// Perform call back on the visitor through reflection.
  		Method method = getMethod(visitor.getClass(), argument);
  		if (method == null) {
  			if (logger.isWarnEnabled()) {
  				logger.warn("No method found by reflection for visitor class ["
  						+ visitor.getClass().getName()
  						+ "] and argument of type ["
  						+ (argument != null ? argument.getClass().getName()
  								: "") + "]");
  			}
  			return null;
  		}
  		try {
  			Object[] args = null;
  			if (argument != null) {
  				args = new Object[] { argument };
  			}
  			if (!Modifier.isPublic(method.getModifiers())
  					&& !method.isAccessible()) {
  				method.setAccessible(true);
  			}
  			return method.invoke(visitor, args);
  
  		} catch (Exception ex) {
  			ReflectionUtils.handleReflectionException(ex);
  			throw new IllegalStateException("Should never get here");
  		}
  	}
docs: Use reflection to call the appropriate <code>visit</code> method on the
  provided visitor, passing in the specified argument.
  
  @param visitor
  the visitor encapsulating the logic to process the argument
  @param argument
  the argument to dispatch
  @throws IllegalArgumentException
  if the visitor parameter is null