public static Hand evaluate(List<Card> sourceCards) {
        final Holder<Hand> handHolder = new Holder<Hand>();
        final HandCombinationSink handCombinationSink = new HandCombinationSink() {
            @Override
            public void setBestHand(Hand hand) {
                assert handHolder.value == null;
                handHolder.value = hand;
            }
        };

        do {
            if (maybeStraightFlush(sourceCards, handCombinationSink)) {
                break;
            }

            if (maybeFourOfAKind(sourceCards, handCombinationSink)) {
                break;
            }

            if (maybeFullHouse(sourceCards, handCombinationSink)) {
                break;
            }

            if (maybeFlush(sourceCards, handCombinationSink)) {
                break;
            }

            if (maybeStraight(sourceCards, handCombinationSink)) {
                break;
            }

            if (maybeThreeOfAKind(sourceCards, handCombinationSink)) {
                break;
            }

            if (maybeTwoPairs(sourceCards, handCombinationSink)) {
                break;
            }

            if (maybePair(sourceCards, handCombinationSink)) {
                break;
            }

            highCard(sourceCards, handCombinationSink);
        } while (false);

        assert handHolder.value != null;
        return handHolder.value;
    }