protected final ImmutableSet<Position> getMovesTo(final Board<?> board, final Direction dir) {
		checkNotNull(board);
		checkNotNull(dir);
		
		final ImmutableSet.Builder<Position> moves = ImmutableSet.builder();
		
		Position pos = board.getPositionFor(this).relative(dir.i(), dir.j());
		while (board.isValidPosition(pos) && (!board.isPieceAt(pos) || isEnemy(board.getPieceAt(pos)))) {
			moves.add(pos);
			
			if (board.isPieceAt(pos)) {
				break;
			}
			
			pos = pos.relative(dir.i(), dir.j());
		}
		
		return moves.build();
	}