public Object callInstanceMethod(Object target, String name,
			Object... arguments) throws IllegalArgumentException,
			IllegalAccessException, InvocationTargetException {
		Method[] methods = wrappedClass.getMethods();
		Method applicableMethod = null;
		Object[] coercedArguments = new Object[arguments.length];

		for (int i = 0; i < methods.length; i++) {
			Method m = methods[i];

			if (m.getName().equals(name)) {
				Class[] paramTypes = m.getParameterTypes();
				if (paramTypes.length == arguments.length) {
					int j = 0;
					while (j < paramTypes.length) {
						if (!argumentMatchType(arguments, paramTypes,
								coercedArguments, j)) {
							// System.err.println("[class '" + m_class.getName()
							// + "' [method '" + name + "'] Failed matching '" +
							// arguments[j].getClass() + "' with '" +
							// paramTypes[j] + "'");
							break;
						}
						j++;
					}
					if (j == paramTypes.length) {
						if (applicableMethod == null) {
							applicableMethod = m;
						} else {
							throw new NoSuchMethodError(
									"More than one method named "
											+ name
											+ " is applicable on provided arguments");
						}
					}
				}
			}
		}
		if (applicableMethod != null) {
			return applicableMethod.invoke(target, coercedArguments);
		}
		throw new NoSuchMethodError("No method named " + name
				+ " is applicable on provided arguments");
	}