anchor.diff:  ;;----------------------------------------------------------------------
   
   (defmacro def-event-source (name &body slots)
  -  (let* ((id (or (gethash name *ids*) (%next-id)))
  -	 (make (intern (format nil "MAKE-~a" name) (symbol-package name)))
  -	 (apply (intern (format nil "APPLY-~a" name) (symbol-package name)))
  -	 (add (intern (format nil "ADD-~a" name) (symbol-package name)))
  -	 (add-n (intern (format nil "ADD-N-~a" name) (symbol-package name)))
  +  (let* ((apply (intern (format nil "APPLY-~a" name) (symbol-package name)))
   	 (slot-names (mapcar #'first slots))
   	 (accessor-names (mapcar (lambda (x)
   				   (intern (format nil "~a-~a" name x)
   					   (symbol-package name)))
   				 slot-names))
  -	 (did-set (mapcar #'gensym (mapcar #'symbol-name slot-names))))
  +	 (did-set (mapcar #'gensym (mapcar #'symbol-name slot-names)))
  +	 (apply-args `(source timestamp
  +			      &key ,@(mapcar (lambda (x y) `(,x nil ,y))
  +					     slot-names did-set))))
       `(progn
  -       (setf (gethash ',name *ids*) ,id)
  -       (deftclass (,name (:include regular-source)) ,@slots)
  -       (defun ,apply (group index &key ,@(mapcar (lambda (x y) `(,x nil ,y))
  -						 slot-names did-set))
  -	 (let ((it (aref (aref (source-group-sources group) ,id) index)))
  -	   ,@(mapcar (lambda (x y z) `(when ,y (setf (,z it) ,x)))
  -		     slot-names did-set accessor-names))
  -	 ;; new events :)
  -	 )
  -       (defun ,add (group)
  -	 (let ((g (source-group-sources group)))
  -	   (make-n-long g ,id)
  -	   (vector-push-extend (,make) (aref g ,id) )))
  -       (defun ,add-n (n group)
  -	 (loop :for i :below n :do (,add group))
  -	 group))))
  +       (deftclass (,name (:include event-source)) ,@slots)
  +       (defun ,apply ,apply-args
  +	 ,@(mapcar (lambda (x y z) `(when ,y (setf (,z source) ,x)))
  +		   slot-names did-set accessor-names)
  +	 (propagate source timestamp))
  +       (define-compiler-macro ,apply ,apply-args
  +	 (let ((src (gensym "source")))
  +	   `(let ((,src ,source))
  +	      ,,@(mapcar (lambda (x y z) `(when ,y (list 'setf (list ',z src) ,x)))
  +			 slot-names did-set accessor-names)
  +	      ,(list 'propagate src timestamp)))))))
   
   (def-event-source button
     (down-p nil :type boolean))
  
positive.code: (def-event-source wheel
    (val 0f0 :type single-float))
  
  ;;----------------------------------------------------------------------
  
  (defmacro def-combo-event-source (name slots (&key event-var) &body body)
    (assert (symbolp event-var))
    (let* (;; funcs
  	 (make (intern (format nil "MAKE-~a" name) (symbol-package name)))
  	 (logic (intern (format nil "%~a-BODY" name) (symbol-package name)))
  	 (add (intern (format nil "ADD-~a" name) (symbol-package name)))
  	 (active (intern (format nil "~s-ACTIVE-P" name)
  			 (symbol-package name)))
  	 (body-func (hide (format nil "~s-BODY" name)
  			  (symbol-package name)))
  	 ;;state-slots
  	 (original-slot-names (mapcar #'first slots))
  	 (accessor-names (mapcar (lambda (x)
  
negative.code: 
  ;;----------------------------------------------------------------------
  
  (deftclass event-source
    (combos (make-array 0 :element-type 'function
  		      :adjustable t :fill-pointer 0)))
  
  (deftclass (combo (:include event-source))
    (predicate (error "Bug found in skitter: combos must always be created with predicate logic")))
  
  ;;----------------------------------------------------------------------
  
  (defmacro defkind (name &body slots)
    (labels ((parse-slot (s)
  