     }
   }
 
-  @discardableResult
-  public func addColumn(with views: [UIView]) -> GridColumn {
-    return insertColumn(at: columns.count, with: views)
-  }
-
-  @discardableResult
-  public func addRow(with views: [UIView]) -> GridRow {
-    return insertRow(at: rows.count, with: views)
-  }
-
-  public func cell(atColumnIndex columnIndex: Int, rowIndex: Int) -> GridCell {
+  // MARK: Count
+
+  open var numberOfColumns: Int {
+    return columns.count
+  }
+
+  open var numberOfRows: Int {
+    return rows.count
+  }
+
+  // MARK: Get
+
+  open func row(at index: Int) -> GridRow {
+    return rows[index]
+  }
+
+  open func index(of row: GridRow) -> Int? { // Note: NSGridView returns a non-optional Int
+    return rows.index { $0 === row }
+  }
+
+  open func column(at index: Int) -> GridColumn {
+    return columns[index]
+  }
+
+  open func index(of column: GridColumn) -> Int? { // Note: NSGridView returns a non-optional Int
+    return columns.index { $0 === column }
+  }
+
+  open func cell(atColumnIndex columnIndex: Int, rowIndex: Int) -> GridCell {
     return grid[rowIndex][columnIndex]
   }
 
-  public func cell(for view: UIView) -> GridCell? {
+  open func cell(for view: UIView) -> GridCell? {
     for row in grid {
       for cell in row {
         if cell.contentView == view {


    grid.insert(cells, at: index)

    updateGrid() // TODO: Is this the correct place?

    return row
  }

  public func row(at index: Int) -> GridRow {
    return rows[index]
  }

  public func removeColumn(at index: Int) {
    columns.remove(at: index)
    for (rowIndex, _) in grid.enumerated() {
      grid[rowIndex].remove(at: index)
    }

    // TODO: updateGrid() ?
  }

  public func removeRow(at index: Int) {
    rows.remove(at: index)
    grid.remove(at: index)

    // TODO: updateGrid() ?
  }
}

// MARK: - GridRow

    return nil
  }

  // MARK: Add, insert, move and remove

  @discardableResult
  open func addRow(with views: [UIView]) -> GridRow {
    return insertRow(at: rows.count, with: views)
  }

  open func insertRow(at index: Int, with views: [UIView]) -> GridRow {
    for _ in 0..<max(0, views.count - numberOfColumns) {
      addColumn(with: [])
    }
