private String buildFullMessage(String msg, Object arg0, Object arg1, Object arg2, Object[] argArray) {
		StringBuilder sb = null;
		int lastIndex = 0;
		int argC = 0;
		while (true) {
			int argIndex = msg.indexOf(ARG_STRING, lastIndex);
			// no more {} arguments?
			if (argIndex == -1) {
				break;
			}
			if (sb == null) {
				// we build this lazily in case there is no {} in the msg
				sb = new StringBuilder(DEFAULT_FULL_MESSAGE_LENGTH);
			}
			// add the string before the arg-string
			sb.append(msg, lastIndex, argIndex);
			// shift our last-index past the arg-string
			lastIndex = argIndex + ARG_STRING.length();
			// add the argument, if we still have any
			if (argArray == null) {
				if (argC == 0) {
					appendArg(sb, arg0);
				} else if (argC == 1) {
					appendArg(sb, arg1);
				} else if (argC == 2) {
					appendArg(sb, arg2);
				} else {
					// we have too many {} so we just ignore them
				}
			} else if (argC < argArray.length) {
				appendArg(sb, argArray[argC]);
			} else {
				// we have too many {} so we just ignore them
			}
			argC++;
		}
		if (sb == null) {
			// if we have yet to create a StringBuilder then just append the msg which has no {}
			return msg;
		} else {
			// spit out the end of the msg
			sb.append(msg, lastIndex, msg.length());
			return sb.toString();
		}
	}