public void invoke(T instance) throws CmdLineParseException {
			// we need to see if there is an array in there somewhere...
			int arrayRank = method.arrayIndex;
			int otherArgCount = method.args.length;
			if (arrayRank >= 0)
				otherArgCount--;

			int arrayArgs = args.size() - otherArgCount;

			Class[] types = method.args;
			Object[] invokeArgs = new Object[types.length];
			int argIndex = 0;
			int typeIndex = 0;
			while (argIndex < args.size()) {
				Class c = types[typeIndex];
				Object o = null;
				if (c.isArray()) {
					Class atype = c.getComponentType();
					o = Array.newInstance(atype, arrayArgs);
					for (int a = 0; a < arrayArgs; a++) {
						Object ad = null;
						try {
							ad = parseObject(atype, args.get(argIndex));
						} catch (Exception e) {
							throw new CmdLineParseException("Error parsing " + name + " at argument " + (argIndex + 1), name, args, e);
						}
						Array.set(o, a, ad);
						argIndex++;
					}
				} else {
					try {
						o = parseObject(c, args.get(argIndex));
					} catch (Exception e) {
						throw new CmdLineParseException("Error parsing " + name + " at argument " + (argIndex + 1), name, args, e);
					}
					argIndex++;
				}
				invokeArgs[typeIndex] = o;
				typeIndex++;
			}
			try {
				method.method.invoke(instance, invokeArgs);
			} catch (InvocationTargetException ite) {
				Throwable t = ite.getTargetException();
				throw new CmdLineParseException(t.getMessage(), name, args, t);
			} catch (Exception e) {
				throw new CmdLineParseException("Error invoking " + name, name, args, e);
			}
		}