public List<FiveCardPokerHand> createAllPossibleHands() {
        int minimumAmountOfCardsUsed = startingHand.getMinimumAmountOfCardsUsed();
        int maximumAmountOfCardsUsed = startingHand.getMaximumAmountOfCardsUsed();

        List<FiveCardPokerHand> allPossibleHands = new ArrayList<FiveCardPokerHand>();
        List<Card> startingHandCards = startingHand.getCards();
        List<Card> boardCards = board.getCards();

        if (minimumAmountOfCardsUsed == 0) {
            allPossibleHands.add(new FiveCardPokerHand(boardCards));
            minimumAmountOfCardsUsed++;
        }

        for (int i = minimumAmountOfCardsUsed; i <= maximumAmountOfCardsUsed; i++) {
            List<List<Card>> combinationsOfStartingHandCards = Combination.takeKFromList(startingHandCards, i);
            List<List<Card>> combinationsOfBoardCards = Combination.takeKFromList(boardCards, 5 - i);

            for (List<Card> combinationHand : combinationsOfStartingHandCards) {                
                if (!combinationsOfBoardCards.isEmpty()) {
                    // Community card games
                    for (List<Card> combinationBoard : combinationsOfBoardCards) {
                        List<Card> fiveCards = new ArrayList<Card>();
                        fiveCards.addAll(combinationHand);
                        fiveCards.addAll(combinationBoard);
                        allPossibleHands.add(new FiveCardPokerHand(fiveCards));
                    }
                } else {
                    // Non-community card games
                    allPossibleHands.add(new FiveCardPokerHand(combinationHand));
                }
            }
        }

        return allPossibleHands;
    }