void processInformedMatches() {
        for (MatchesList.Match match : matches) {
            WalkResult matchedValue = evaluator.evaluate(match.getResult(), match.getKey(), match.getValue());
            if (matchedValue != null) {
                inform(match.getKey(), matchedValue);
                return; // We always stick to the first match
            }
        }

        if (isValidWithoutMatches()) {
            WalkResult matchedValue = evaluator.evaluate(NULL_PARSE_TREE, null, null);
            if (matchedValue != null) {
                inform(null, matchedValue);
            }
        }
    }
Optimization: Only if there is a possibility that all actions for this matcher CAN be valid do we
actually perform the analysis and do the (expensive) tree walking and matching.
analyzer/src/main/java/nl/basjes/parse/useragent/analyze/MatcherAction.java