def move(str)
      move       = PGN::Move.new(str, self.player)
      calculator = PGN::MoveCalculator.new(self.board, move)

      new_castling = self.castling - calculator.castling_restrictions
      new_halfmove = calculator.increment_halfmove? ?
        self.halfmove + 1 :
        0
      new_fullmove = calculator.increment_fullmove? ?
        self.fullmove + 1 :
        self.fullmove

      PGN::Position.new(
        calculator.result_board,
        self.next_player,
        new_castling,
        calculator.en_passant_square,
        new_halfmove,
        new_fullmove,
      )
    end
def move(str)
      move       = PGN::Move.new(str, self.player)
      calculator = PGN::MoveCalculator.new(self.board, move)

      new_castling = self.castling - calculator.castling_restrictions
      new_halfmove = calculator.increment_halfmove? ?
        self.halfmove + 1 :
        0
      new_fullmove = calculator.increment_fullmove? ?
        self.fullmove + 1 :
        self.fullmove

      PGN::Position.new(
        calculator.result_board,
        self.next_player,
        new_castling,
        calculator.en_passant_square,
        new_halfmove,
        new_fullmove,
      )
    end
@param board [PGN::Board] the board for the position
 @param player [Symbol] the player who moves next
 @param castling [Array<String>] the castling moves that are still
   available
 @param en_passant [String, nil] the en passant square if applicable
 @param halfmove [Integer] the number of halfmoves since the last pawn
   move or capture
 @param fullmove [Integer] the number of fullmoves made so far

 @example
   PGN::Position.new(
     PGN::Board.start,
     :white,
   )

 @param str [String] the move to make in SAN
 @return [PGN::Position] the resulting position

 @example
   queens_pawn = PGN::Position.start.move("d4")