Magritte is a metamodel description framework for Smalltalk, that is, a way of describing your domain objects. Having a description of your domain objects allows you to do a bunch of neat things, like automatically building a Seaside form for displaying an object.
If you’ve used C#’s ASP.Net MVC framework, you might think of the Magritte description as the collection of annotations your Model or ViewModel objects might have. Instead of
Magritte allows you to describe more than how to render a field, or in what order to render fields. It allows you to describe how to access the parts of an object, whether directly calling its selector, plugging into a chain of accessors, or a memento-decorated object, and so on. Magritte can also describe the relationships between objects, like one-to-one or one-to-many.
Magritte provides us with a uniform way of accessing parts of an object, without resorting to reflection.
How would one zip over a tree of Magritte-described objects? Building on our previous work it’s not hard at all: we have an n-ary tree of objects. First, we make sure we fully annotate our domain objects with Magritte descriptions.
Next, we do two things: first, Magritte allows us to serialise all our children as an
and so we can unserialise this collection as a newly-instantiated object:
We need to adjust our original
TreeZipper, which had a few hard-coded bits. We change references to
TreeZipper new to
self class new, and instead of creating
ZTree value: foo children: bar we allow subclasses to create their own objects:
self newFocusOn: foo children: bar. In particular, we say
We’re being a bit tricky here: if aCollection is empty, we have a “primitive” value – something with no subcomponents, like a number or a
String – while a non-empty
aCollection indicates some composite object: an
And that’s it!
 Yes, a
String‘s actually an
Character, but usually the individual characters aren’t interesting, so we treat it as a primitive value.