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 ;