private bool IsValid(Chessboard chessboard, GameMove move, GameHistory gameHistory)
        {
            var chessPiece = chessboard.GetChessPieceOrDefault(move.From);

            if (!chessPiece.HasValue)
            {
                return(false);
            }

            var chessBoardCopy  = (Chessboard)chessboard.Clone();
            var gameHistoryCopy = (GameHistory)gameHistory.Clone();

            gameHistoryCopy.Add(move, chessPiece.Value.Owner, chessBoardCopy);
            chessBoardCopy.Move(move);

            var kingCoordinate = chessBoardCopy.GetCoordinate(new ChessPiece {
                Owner = chessPiece.Value.Owner, Type = ChessPieceType.King
            });
            var isKingInDanger = IsCoordinateInDanger(chessBoardCopy, chessPiece.Value.Owner, gameHistoryCopy, kingCoordinate);

            return(!isKingInDanger);
        }