@Override
	public Mono<MatchResult> matches(ServerWebExchange exchange) {
		return Mono.defer(() -> {
			Map<String, Object> variables = new HashMap<>();
			return Flux.fromIterable(matchers)
				.flatMap(matcher -> matcher.matches(exchange))
				.doOnNext(matchResult -> variables.putAll(matchResult.getVariables()))
				.all(MatchResult::isMatch)
				.flatMap(allMatch -> allMatch ? MatchResult.match(variables) : MatchResult.notMatch());
		});
	}