   ;; TODO: Handle immutable column sources
   ;; TODO: How do we handle removal of the last page for documents?
   (remove-pages! [_ state page-ids]))
+
+(defprotocol SpecialColumn
+  (special-column-ui [_]))
+
+(defn special-column? [x]
+  (satisfies? SpecialColumn x))
 
 (defprotocol ColumnDropTarget
   (accept-drop! [_ state pages target-idx]))

                                 (assoc :dragover? (= drop-idx (:idx page) ))
                                 (mark-page-selected (:selected selection))))}))]]))

(defn ^:private inbox-handle-drop! [state owner page-cache target source page-ids target-idx]
  (let [columns (om/get-state owner :columns)
        target  (first (filter #(= (:id %) target) columns))

  [page selected-pages]
  (assoc page :selected? (contains? (set selected-pages) (:id page))))

(ui/defcomponent inbox-column [[state column] owner]
  (init-state [_]
    {:selection (->> (column-pages column state)
                     (map :id)
