public final boolean matches(RuleEvaluation e) {
        // TODO: With this algoritm, each choice point will move to the next choice on each reevaluation
        // In the case where there are multiple ellipses, we may want to do globally coordinated
        // moves of all the choice points instead
        try {
            preMatchHook(e);

            if (!matchesStartAnchor(e)) return false;

            String higherLabel = e.getCurrentLabel();
            if (getLabel() != null)
                e.setCurrentLabel(getLabel());

            boolean matches = doesMatch(e);
            while ( ! matches && hasOpenChoicepoint(e)) {
                matches = doesMatch(e);
            }

            e.setCurrentLabel(higherLabel);

            if ( ! matchesEndAnchor(e)) return false;

            traceResult(matches, e);
            return matches;
        }
        finally {
            postMatchHook(e);
        }

    }
Returns whether this condition matches the given evaluation
at the <i>current</i> location of the evaluation. Calls the doesMatch
method of each condition subtype.
container-search/src/main/java/com/yahoo/prelude/semantics/rule/Condition.java