private IEnumerable<RotatedPiece> GetNextOrientationPermutation(RotatedPieceHolder[] orderPermutation)
        {
            var lastPiece = orderPermutation.Last();

            if (lastPiece.RotationNumber > 4) {
                lastPiece.Reset();
                if (!RotateEarlierPieces(orderPermutation))
                    return null;
            }

            var rotatedPieces = (from rph in orderPermutation select new RotatedPiece(rph.Piece, rph.Orientation)).ToList();
            lastPiece.Rotate();

            return rotatedPieces;
        }
        private bool RotateEarlierPieces(RotatedPieceHolder[] orderPermutation)
        {
            int numPieces = orderPermutation.Length;

            if (numPieces <= 1)
                return false;

            var indexZeroHasBeenReset = false;

            for (int i = numPieces - 2; i >= 0; i--) {
                if (orderPermutation[i].RotationNumber < 4) {
                    orderPermutation[i].Rotate();
                    break;
                }

                orderPermutation[i].Reset();
                indexZeroHasBeenReset = i == 0;
            }

            return !indexZeroHasBeenReset;
        }