public void update( Goban goban, Point stonePoint )
  {
    // Examine the stone on the goban at the given point.
    //
    Point point = (Point)stonePoint;
    Stone placed = getGoban().getStone( point );
    int captures = 0;
    
    // Toggle white's turn.
    //TODO what is this doing
    setWhiteToPlay( !placed.isWhite() );
    
    // Create a point to keep track of the KO spot
    Point koPoint = new Point();
    boolean captureFlag = false;

    // If the number of liberties for an orthagonal group of opposite colour
    // to the stone played is zero, then we remove the group at that point.
    //
    // Search Up. Y = -1 (relative to original position)
    //
    point.y--;
    captures += tryCullGroup( placed, point );
    
    // Set Ko Location
    if (captures == 1 && captureFlag == false) {
    	koPoint.x = point.x;
    	koPoint.y = point.y;
    	captureFlag = true;
    }

    // Search Down. Y = +1 (relative to original position)
    //
    point.y += 2;
    captures += tryCullGroup( placed, point );

    // Set Ko Location
    if (captures == 1 && captureFlag == false) {
    	koPoint.x = point.x;
    	koPoint.y = point.y;
    	captureFlag = true;
    }

    // Search Left.
    //   Y = 0 (relative to original position)
    //   X = -1 (relative to original position)
    //
    point.y--;
    point.x--;
    captures += tryCullGroup( placed, point );
    
    // Set Ko Location
    if (captures == 1 && captureFlag == false) {
    	koPoint.x = point.x;
    	koPoint.y = point.y;
    	captureFlag = true;
    }

    // Search Right. X = +1 (relative to original position)
    //
    point.x += 2;
    captures += tryCullGroup( placed, point );
    
    // Set Ko Location
    if (captures == 1 && captureFlag == false) {
    	koPoint.x = point.x;
    	koPoint.y = point.y;
    	captureFlag = true;
    }

    // Put the X value back to where it belongs, just in case other code
    // uses the X & Y values in "stonePoint" (which is quite likely).
    //
    point.x--;

    // If we captured a single prisoner, set this spot to indicate that
    // a ko is taking place.  Otherwise, indicate that no ko is happening.
    //    
    setKo( (captures == 1) ? koPoint : null );
  }