From 8b19b56a1c871773ae09e2eecd933593673ef3e6 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 21 Jan 2010 04:32:31 +1300 Subject: [PATCH] classes.mixin: privacy please --- core/classes/mixin/mixin.factor | 52 +++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/core/classes/mixin/mixin.factor b/core/classes/mixin/mixin.factor index cc67a75407..44e66dd79c 100644 --- a/core/classes/mixin/mixin.factor +++ b/core/classes/mixin/mixin.factor @@ -17,23 +17,6 @@ M: mixin-class reset-class M: mixin-class rank-class drop 3 ; -: redefine-mixin-class ( class members -- ) - [ (define-union-class) ] - [ drop t "mixin" set-word-prop ] - 2bi ; - -: define-mixin-class ( class -- ) - dup mixin-class? [ - drop - ] [ - { - [ { } redefine-mixin-class ] - [ H{ } clone "instances" set-word-prop ] - [ changed-definition ] - [ update-classes ] - } cleave - ] if ; - TUPLE: check-mixin-class class ; : check-mixin-class ( mixin -- mixin ) @@ -41,6 +24,13 @@ TUPLE: check-mixin-class class ; \ check-mixin-class boa throw ] unless ; + + +GENERIC# add-mixin-instance 1 ( class mixin -- ) + +M: class add-mixin-instance + [ 2drop ] [ (add-mixin-instance) ] if-mixin-member? ; + : remove-mixin-instance ( class mixin -- ) [ (remove-mixin-instance) ] [ 2drop ] if-mixin-member? ; M: mixin-class class-forgotten remove-mixin-instance ; +: define-mixin-class ( class -- ) + dup mixin-class? [ + drop + ] [ + { + [ { } redefine-mixin-class ] + [ H{ } clone "instances" set-word-prop ] + [ changed-definition ] + [ update-classes ] + } cleave + ] if ; + ! Definition protocol implementation ensures that removing an ! INSTANCE: declaration from a source file updates the mixin. TUPLE: mixin-instance class mixin ; C: mixin-instance +mixin-instance< ( mixin-instance -- class mixin ) [ class>> ] [ mixin>> ] bi ; inline +PRIVATE> + M: mixin-instance where >mixin-instance< "instances" word-prop at ; M: mixin-instance set-where >mixin-instance< "instances" word-prop set-at ;