-! Copyright (C) 2007, 2008 Doug Coleman, Slava Pestov.
+! Copyright (C) 2007, 2009 Doug Coleman, Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors continuations kernel namespaces make
-sequences vectors ;
+sequences vectors sets assocs init ;
IN: destructors
-TUPLE: disposable disposed ;
+SYMBOL: disposables
+
+[ H{ } clone disposables set-global ] "destructors" add-init-hook
+
+<PRIVATE
+
+: register-disposable ( obj -- )
+ disposables get conjoin ;
+
+: unregister-disposable ( obj -- )
+ disposables get delete-at ;
+
+PRIVATE>
+
+TUPLE: disposable < identity-tuple disposed id ;
+
+M: disposable hashcode* nip id>> ;
+
+: new-disposable ( class -- disposable )
+ new \ disposable counter >>id
+ dup register-disposable ; inline
GENERIC: dispose* ( disposable -- )
M: object dispose
dup disposed>> [ drop ] [ t >>disposed dispose* ] if ;
+M: disposable dispose
+ [ unregister-disposable ] [ call-next-method ] bi ;
+
: dispose-each ( seq -- )
[
[ [ dispose ] curry [ , ] recover ] each