(define callback-registry (make-hash-table)) (define-method (refcount (alist )) (cdr (find (lambda (a) (eq? refcount: (car a))) alist))) (define-method (refcount (ht ) (ptr )) (if (hash-table-exists? callback-registry ptr) (refcount (hash-table-ref ht ptr)) 0)) (define-class () ((ptr accessor: ptr initform: #f))) (define-method (delete-pointer (qbase )) (abort (make-property-condition 'exn 'Message "Please implement the delete method for your subtype."))) (define-method (add-ptrentry (qbase )) (hash-table-update! callback-registry (ptr qbase) (lambda (alist) (alist-update refcount: (+ 1 (refcount alist)) alist)) (lambda () (alist-cons refcount: 1 '())))) (define-method (remove-ptrentry (qbase )) (if (eq? 1 (refcount callback-registry (ptr qbase))) (hash-table-delete! callback-registry (ptr qbase)) (hash-table-update! callback-registry (ptr qbase) (lambda (alist) (alist-update refcount: (- (refcount alist) 1) alist))))) (define-method (initialize-instance (qbase )) (call-next-method) (add-ptrentry qbase) (set-finalizer! qbase (lambda (obj) (remove-ptrentry qbase) (when (= 0 (refcount callback-registry (ptr qbase)))))))