public T processArguments(String[] args,T instance) throws CmdLineParseException {
		if(instance instanceof InitFinishParserObject){
			((InitFinishParserObject)instance).init();
		}
		// first we break up the args at switches.
		List<DelimitedArgs> delimited = new ArrayList<DelimitedArgs>();
		List<String> current = new ArrayList<String>();
		HashSet<String> requiredTest = new HashSet<String>(required);
		String name = "";
		for (int i = 0; i < args.length; i++) {
			// System.out.println("Arg:"+args[i]+"\t"+i+"\t"+current+"\t"+name);
			if (switches.containsKey(args[i])) {
				if (name.length() != 0 || !current.isEmpty()) {
					delimited.add(new DelimitedArgs(name, current));
					current = new ArrayList<String>();
				}
				name = args[i];
			} else {
				current.add(args[i]);
			}
			// System.out.println("ArgE:"+args[i]+"\t"+i+"\t"+current+"\t"+name);
		}
		//if (!current.isEmpty())
			delimited.add(new DelimitedArgs(name, current));
		Collections.sort(delimited, new RankCompare());// make sure everything
														// gets invoked in the
		// right order
		for (DelimitedArgs da : delimited) {
			// System.out.println("Invoke:"+da.method);
			requiredTest.remove(da.method.cmdData.names()[0]);
			da.invoke(instance);
		}
		if (!requiredTest.isEmpty()) {
			throw new CmdLineParseException("Required Options missing:" + requiredTest);
		}
		if(instance instanceof InitFinishParserObject){
			((InitFinishParserObject)instance).finished();
		}
		return instance;
	}