@Override
    public boolean controls(final ChessCoord coord) {
        // First check for general reasons that we don't control the position.
        // This includes checking that we are not placed on the coordinate
        // ourselves. This is important to know for the following checks.
        if (!super.controls(coord)) {
            return false;
        }

        // Here we are sure we are not at the coordinate ourselves
        final int currRank = this.getCoord().getRank();
        final int currFile = this.getCoord().getFile();

        /*
         * Now check for if we are either on the same file or rank. Afterwards
         * check where the coordinate is relative to us (right/left,
         * above/below) and set the step accordingly. Afterwards loop to we can
         * see whether something is in our way. If not, we control the piece.
         */
        if (currRank == coord.getRank()) {
            final int stepFile = currFile < coord.getFile() ? STEP_RIGHT
                    : STEP_LEFT;
            return this.controls(coord, stepFile, STEP_STAY);
        } else if (currFile == coord.getFile()) {
            final int stepRank = currRank < coord.getRank() ? STEP_UP
                    : STEP_DOWN;
            return this.controls(coord, STEP_STAY, stepRank);
        }
        // Not on the same line, we cannot reach the coordinate.
        return false;
    }