 Automatically updates elements mapped to data according to key-fn (defaults to index) and removes elements that don't match.
 Scoped to selector, if given, otherwise applies to all container's children.
 Optional enter, update, and exit functions called before DOM is changed; return false to prevent default behavior."
-  [container data mapping & {:keys [selector key-fn post-fn update exit enter]
+  [container data mapping & {:keys [selector key-fn pre-fn post-fn update exit enter]
                              :or {key-fn (fn [d idx] idx)
                                   enter  (fn [d idx new-node]
                                            #_(p "no-op enter called")

                                        :enter  enter
                                        :update update
                                        :exit exit
                                        :post-fn post-fn)))
                   @data)
               data)



                (if (not= d (:datum old))
                  (if (update d idx (:node old) new-node)
                    (merge-dom! (:node old) new-node

                                ;;don't use requestAnimationFrame until we can figure out how to get it playing nicely with automated tests.
                                ;;:defer-attr true
                                ))))
