anchor.diff:  	   :accessor events)))
      
   
  -(defparameter *on-mouse-click-objects* (make-hash-table))
  -(defparameter *on-mouse-down-objects* (make-hash-table))
  -(defparameter *on-mouse-up-objects* (make-hash-table))
  -(defparameter *on-mouse-move-objects* (make-hash-table))
  -(defparameter *on-hover-objects* (make-hash-table))
  -(defparameter *on-exit-objects* (make-hash-table))
  +(defparameter *event-hash* (make-hash-table))
   (defparameter *last-hover-target* nil)
   (defparameter *last-mouse-down-target* nil)
   
  
positive.code: 	    (f (make-event-handler quad text)))
         (draw-pressed quad text)
         (add-child node quad)
      ;;(setf (gethash node *gui-objects*)
      (setf (gethash node *on-mouse-click-objects*) f)
      (setf (gethash node *on-hover-objects*) f)
      (setf (gethash node *on-mouse-move-objects*) f)
      (setf (gethash node *on-exit-objects*) f)
      (setf (gethash node *on-mouse-down-objects*) f)
      (setf (gethash node *on-mouse-up-objects*) f)
      (add-child *node* node)
      node)))
  
  (defun get-last-button ()
    (car (children *node*)))
  
  (defun remove-button (node)
    (remhash node *on-mouse-click-objects*)
    (remhash node *on-hover-objects*)
    (remhash node *on-mouse-move-objects*)
    (remhash node *on-exit-objects*)
    (remhash node *on-mouse-down-objects*)
    (remhash node *on-mouse-up-objects*)
    (setf (enabled node) nil))
  
  (defun delete-all-buttons ()
  
negative.code: 
    ;;(format t "win: ~A mouse: ~A x: ~A y: ~A button: ~A state: ~A clicks: ~A ts: ~A~%" win mouse x y button state clicks ts)
  
    (let ((event `((:window . ,win)
  		 (:mouse . ,mouse)
  		 (:mouse-screen-position ,x . ,y)
  		 (:button . ,button)
  		 (:state . ,state)
  		 (:clicks . ,clicks)
  		 (:timestamp . ,ts))))
  
      (map-event (lambda (k v)
  		 (multiple-value-bind (collisions start ray) (check-intersect (car (children k)) k x y *viewport* *projection*)
  		   (when collisions
  		     (setf *last-mouse-down-target* k)
  		     (funcall v k collisions (acons :event :mouse-down
  						    (acons :ray-start start
  							   (acons :ray ray event)))))))
  	       :mouse-down)))
  
  (clinch:defevent clinch:*on-mouse-up* (win mouse x y button state clicks ts)
  
    (format t "win: ~A mouse: ~A x: ~A y: ~A button: ~A state: ~A clicks: ~A ts: ~A~%" win mouse x y button state clicks ts)
      (let ((event `((:window . ,win)
  		   (:mouse . ,mouse)
  		   (:mouse-screen-position ,x . ,y)
  		   (:button . ,button)
  		   (:state . ,state)
  		   (:clicks . ,clicks)
  		   (:timestamp . ,ts))))
        (map-event (lambda (k v)
  		   (multiple-value-bind (collisions start ray) (check-intersect (car (children k)) k x y *viewport* *projection*)
  		     (when collisions
  		       (let ((e (acons :ray-start start
  				       (acons :ray ray event))))
  			 (when (eq *last-mouse-down-target* k)
  			   (let ((f (gethash k (gethash :mouse-click *event-hash*))))
  			     (when f (funcall f k collisions  (acons :event :mouse-click e)))))
  			 (funcall v k collisions (acons :event :mouse-up e)))
  		       (setf *last-mouse-down-target* nil))))
  		 
  		 :mouse-up)))
  
  
    ;; (loop for n in *buttons*
  