View · Search · Index
No registered users in community xowiki
in last 10 minutes

[Xotcl] Mixins in XOTcl

From: Adam Turoff <aturoff_at_bna.com>
Date: Mon, 17 May 2004 09:44:41 -0400

Hi,

I'm a long-time Perl programmer who recently started using
XOTcl on a new
project. Support for mixins has been a tremendous boon for
productivity
on this project.

However, the standard idioms for managing mixins (mixin and
mixinappend) both
feel a little broken. For example, with "obj mixin
list_of_classes", I need
to know the full set of mixins for an object (or a class)
each time I mutate it.
Using mixinappend helps, but appending new classes to the
end of the mixin
list seems wrong, because the newly added classes will be
found *last*.

Here is why I think these idioms don't work well: in most
other languages, an
object is created through successive refinement. In
C++/Java, we start with a
base class and derive more and more specific variants on
that definition through
subclassing. I use XSLT a lot, and in XSLT, the most
specific templates are
found after templates of lesser specificity. Surely there
are other examples;
these are just the first two that come to my mind. The
underlying idiom seems
universal, at least to me.

To remedy this, I've added this primitive into my system.
Suggestions for better
names greatfully appreciated:

      Object instproc insert_mixin {mixin_list} {
         my mixin [append mixin_list " " [my info mixin]]
      }

With this new operation, I can now derive an object through
mixins in a very
natural manner:

      Car mycar
      mycar insert_mixin Volkswagen
      mycar insert_mixin NewBeetle
      mycar insert_mixin AutomaticTransmission
      mycar insert_mixin Turbo
      mycar insert_mixin WasabiGreen
      ....

If I were to start calling methods like "max_rpm",
"engine_size", "color",
or "transmission", they can all get intercepted at the right
point in the
mixin chain, wrapping/superceding more generic methods.
Instant separation
of concerns. ;-)

Additionally, I can dynamically refine my object:

      if {$add_roof_rack} {
            mycar insert_mixin RoofRack
      }

      if {$has_sunroof} {
            mycar insert_mixin SunRoof
      }


Thanks for the excellent programming environment. Hope this
helps,

-- Adam