public static boolean maybeStraight(List<Card> sourceCards, HandCombinationSink handCombinationSink) {
        final Holder<Hand> bestHandHolder = new Holder<Hand>();

        CardCombinator.iterate(sourceCards, new CardCombinationCallback() {
            @Override
            public boolean process(List<Card> cards) {
                Collections.sort(cards, new RankComparator());

                int prevRankOrdinal = -1;
                boolean aceFollowsKing = false;
                for (final Card card : cards) {
                    final int newRankOrdinal = card.getRank().ordinal();

                    if (prevRankOrdinal >= 0 && (prevRankOrdinal + 1) != newRankOrdinal) {
                        // test for combination where ACE follows KING, if so -
                        // current card (which is second one) should be TEN, last card should be KING
                        if (prevRankOrdinal != Rank.ACE.ordinal() || card.getRank() != Rank.TEN) {
                            return false;
                        }

                        aceFollowsKing = true;
                    }

                    prevRankOrdinal = newRankOrdinal;
                }

                // ok, this is the straight
                int rating = 0;
                for (final Card card : cards) {
                    rating |= RATING_FLAG_MAP.get(card.getRank());
                }

                if (aceFollowsKing) {
                    final Card ace = cards.get(0);
                    cards.remove(0);
                    cards.add(ace);
                } else {
                    // wheel combination
                    // the ACE rating considered as lowest one (zero) for straight flush when ACE is a leading card
                    rating &= ~RATING_FLAG_MAP.get(Rank.ACE);
                }

                if (bestHandHolder.value == null || bestHandHolder.value.getRating() < rating) {
                    bestHandHolder.value = new DefaultHand(rating, HandRank.STRAIGHT, cards);
                }

                return false;
            }
        }, STRAIGHT_HAND_SIZE);

        return provideBestHand(bestHandHolder, handCombinationSink);
    }