public static final ChessBoard fromString(final String input) {
		final String[] lines = checkNotNull(input).split("/");

		// Get column size on first row
		int colsize = 0;
		for (final char c : lines[0].toCharArray()) {
			colsize += Character.isDigit(c) ? Integer.parseInt(Character.toString(c)) : 1;
		}

		final ChessBoard board = new ChessBoard(lines.length, colsize);

		for (int currow = 1; currow <= lines.length; currow++) {
			int curcol = 1;
			for (final char c : lines[lines.length - currow].toCharArray()) {
				if (Character.isDigit(c)) {
					curcol += Integer.parseInt(Character.toString(c));
					continue;
				}

				board.setPieceAt(new Position(curcol, currow), ChessPiece.fromString(board, c));
				curcol++;
			}

			if (curcol - 1 != colsize)
				throw new IllegalArgumentException("Expected " + colsize + " columns on row " + currow + ", got " + (curcol - 1));
		}

		return board;
	}