protected Parser permuted(final Parser... parsers) {
		final List<Parser> choices = new ArrayList<Parser>(parsers.length);
		for (Parser parser : parsers) {
			choices.add(parser);
		}

		return new Parser() {
			protected boolean accepts(TokenStream stream) {
				if (LOGGER.isTraceEnabled()) {
					push("[permuted>");
				}

				List<Parser> remaining = new ArrayList<Parser>(choices);
				TokenStream sub = new SubordinateTokenStream(stream);

				int i = 0;
				while (i < remaining.size()) {
					if (remaining.get(i).accepts(sub)) {
						sub.commit();
						remaining.remove(i);
						i = 0;

					} else {
						sub.restore();
						i++;
					}
				}

				if (LOGGER.isTraceEnabled()) {
					pop("<permuted]");
				}

				return true;
			}
		};
	};