code: protected void invokeMethod(Method method, D bean, R value)
  	{
  		assert bean != null;
  		try
  		{
  			method.invoke(domain.cast(bean), value);
  		}
  		catch (ClassCastException e)
  		{
  			String message = "Failed to set property: " + property;
  			if (!domain.isAssignableFrom(bean.getClass()))
  			{
  				message += "  Invalid domain bean: " + domain.getSimpleName() + " is not assignable from " +
  				           bean.getClass();
  			}
  			if (!range.isAssignableFrom(value.getClass()))
  			{
  				message += " Invalid range value: " + range + " is not assignable from " + value.getClass();
  			}
  			throw new IllegalBioPAXArgumentException(message, e);
  		}
  		catch (Exception e) //java.lang.reflect.InvocationTargetException
  		{
  			String valInfo = (value == null) ? null : value.getClass().getSimpleName() + ", " + value;
  			String message = "Failed to set " + property + " with " + method.getName() + " on " 
  				+ domain.getSimpleName() + " (" + bean.getClass().getSimpleName() + ", " + bean + ")" 
  				+ " with range: " + range.getSimpleName() + " (" + valInfo + ")";
  			throw new IllegalBioPAXArgumentException(message, e);
  		}
  	}
docs: Calls the <em>method</em> onto <em>bean</em> with the <em>value</em> as its parameter. In this
  context <em>method</em> can be one of these three: set, add, or remove.
  @param method method that is going to be called
  @param bean bean onto which the method is going to be applied
  @param value the value which is going to be used by method