 
     #endif
 
-    /// Executes a move without checking the legality of the move.
-    private func _execute(uncheckedMove move: Move) throws {
-        try _execute(uncheckedMove: move, promotion: { ._queen })
+    /// Executes `move` without checking its legality, updating the state for `self`.
+    ///
+    /// - warning: Can cause unwanted effects. Should only be used with moves that are known to be legal.
+    ///
+    /// - parameter move: The move to be executed.
+    /// - parameter promotion: A piece kind for a pawn promotion.
+    ///
+    /// - throws: `ExecutionError` if no piece exists at `move.start` or if `promotion` is invalid.
+    public func execute(uncheckedMove move: Move, promotion: Piece.Kind) throws {
+        try execute(uncheckedMove: move, promotion: { promotion })
+    }
+
+    /// Executes `move` without checking its legality, updating the state for `self`.
+    ///
+    /// - warning: Can cause unwanted effects. Should only be used with moves that are known to be legal.
+    ///
+    /// - parameter move: The move to be executed.
+    ///
+    /// - throws: `ExecutionError` if no piece exists at `move.start`.
+    public func execute(uncheckedMove move: Move) throws {
+        try execute(uncheckedMove: move, promotion: ._queen)
     }
 
     #if swift(>=3)

        return Bitboard(square: move.end).intersects(moves)
    }

    /// Executes a move without checking the legality of the move.
    private func _execute(uncheckedMove move: Move, promotion: @noescape () -> Piece.Kind) throws {
        guard let piece = board[move.start] else {
            throw ExecutionError.missingPiece(move.start)
        }

        return Bitboard(square: move.end).intersects(moves)
    }

    /// Executes `move` without checking its legality, updating the state for `self`.
    ///
    /// - warning: Can cause unwanted effects. Should only be used with moves that are known to be legal.
    ///
    /// - parameter move: The move to be executed.
    /// - parameter promotion: A closure returning a promotion piece kind if a pawn promotion occurs.
    ///
    /// - throws: `ExecutionError` if no piece exists at `move.start` or if `promotion` is invalid.
    public func execute(uncheckedMove move: Move, @noescape promotion: () -> Piece.Kind) throws {
        guard let piece = board[move.start] else {
            throw ExecutionError.MissingPiece(move.start)
        }
