    "Print out a message using a speech bubble. The message will stay
    for 2.5 seconds until it vanishes. A second call will remove any
    currently displayed message first."
-   [director scene msg]
+   [director scene msg & {:keys [x y duration]
+                          :or {duration 2500
+                               x 20 y (fn [w h]
+                                        (- (.height director) h 20))}}]
    (when current.object
      (log/info logger (str "Expiring old message bubble: " current.object))
      (.setExpired current.object (.time scene)))
-   (let [new-message (gen-bubble
-                      director scene msg
-                      :x 20
-                      :y (fn [w h]
-                           (- (.height director) h 20)) :time 2500)]
+   (let [new-message (gen-bubble director scene msg :x x :y y :time duration)]
      (add! scene new-message)
      (set! current.object new-message))))
 

              (set! this.isOpened true))))

    (set! basket-container.doClose
          (fn []
            (when this.isOpened
              ;; (log/info logger "Closing basket")
              (doto basket-head
                (. (emptyBehaviorList))
                (.setRotation 0)
                (.addBehavior (gen-move-behavior basket-head :from {:up 30})))
              (.addBehavior basket-body
                            (doto (CAAT/ScaleBehavior.)
                              (.setFrameTime (.time basket-body) 120)

              (set! this.isOpened false))))
    ;; make sure the sprite changes when the mouse hovers over the basket
    (set! basket-body.mouseEnter (fn [mouseEvent]
                                   ;; (. basket-container (doMunch))
                                   (. basket-container (doOpen))
                                   ))
    (set! basket-body.mouseExit (fn [mouseEvent] (. basket-container (doClose))))
