[Xotcl] Mixins in XOTcl

Adam Turoff aturoff at bna.com
Wed May 19 17:03:30 CEST 2004

You wrote:
> >       Object instproc insert_mixin {mixin_list} {
> >          my mixin [append mixin_list " " [my info
> >       }
> with names like mixinappend, mixinprepend for mixins,
> instmixins, instfilters we would introduce a large number
> methods, which do more or less the same.

Yes.  That is certainly a problem.

> what do you people think about the following "interceptor"
> method: it is more verbous, but much more powerful as
well; it
> allows appending/prepending/inserting at a certain
position and
> deletion of all kinds of interceptors:


One minor niggle is the use of the term 'interceptor'.  The
term is quite
overloaded.  First, this instproc manages two kinds of
interfaces for an object: mixins and filters.  Second, the
proc itself
is an interceptor -- it traps calls to manage the mixin and
lists.  Third, as you have written this proc, it manages
both mixins and
filters, which makes them appear more similar than they
really are.

That said, I do think you are on to something.  The core
problem is that
both filters and mixins are a list of classes, and there are
no good
primitives to manage that list in a natural manner.  It
would be nice if
[my info mixin] and [my info filter] were mutable with list
commands, but...

So, for the sake of argument, let us assume that there are
two new
instprocs - one to manage the list of filters, and one to
manage the list
of mixins (again, better naming ideas greatly appreciated):

    Object instproc mixin_list args {
        set op [lindex $args 0]
        set classes [lrange $args 1 [llength $args]]

        switch -exact $op {
            append  { my mixin [concat [my info mixin]
$classes] }
            prepend { my mixin [concat $classes [my info
mixin]] }
            set     { my mixin $classes }
            get     { my info mixin }
            delete  { ... }

    Class A
    Class B
    Class C

    A a
    a mixin_list append B
    a mixin_list prepend C
    a mixin_list get
    ::C ::B

Adding new primitive operations (like a mixin_list length; a
mixin_list sort;
a mixin_list contains classname; etc.) is simple and
obvious.  I haven't played
with filters yet, but this idiom should work well there,

I'll leave it to you to determine whether this method should
work use
instmixin for Classes, and mixin for Objects.

-- Adam

More information about the Xotcl mailing list