[Seaside] components via meta-data?

itsme213 itsme213 at hotmail.com
Sun Jul 2 18:23:46 UTC 2006


Hi Lukas,

> Hi ItsYou,

er, that would be "itsme" :-)

> Another such project available in public is Magritte,

That looks great!

>>   - (meta)operations on those objects
>
> Mewa doesn't support that. For Magritte this is only supported on a
> very basic level, such as for comparison operators, though it is
> definitely feasible on a more generic level.

OK.

>> A meta-object (in this discussion) is NOT a class; rather, it is a
>> proxy-like object carrying meta-information for a specific domain object
>> (instance). (The "meta" terminology comes from Mewa).
>
> I would not call that proxy, a proxy is something that is on the same
> meta level than the proxied object. A proxy represents the proxied
> object. It is rather a type object.

The usual multipicity of typeObject:object is 1:N. Not so for these 
meta-objects. I prefer to call them "objectReflections", see below.

>> A meta-attribute is an object carrying meta-information for the value of 
>> a
>> specific attribute of a specific object.
>
> In Magritte attributes and objects are unified, since an attribute is
> an object again. I don't see why the separation of those would be a
> benefit, maybe there is a good reason?

But an attribute is NOT an object. The #value of an attribute, for a 
specific owner object, IS an object. This is a big difference.

Suppose
  joe home = 111USA
then
joe metaAttributeFor: #home  , or
joe attributeReflectionFor: #home
  is an object that encapsulates
    owner = joe
    attr = #home
    value = 111USA

e.g. the object 111USA would know nothing about the label "home", but the 
metaAttribute would.

This can also provide a single context for creating objects. The 
Meta-properties of an attribute include "own / create: Boolean". This 
attribute should be orthogonal to the multiplicity property (a mistake in 
Mewa, imo). Every domain object is created in the context of such a 
meta-attribute, and is automatically owned by the owner of that attribute. 
There is no need for special treatment of the object collections of the 
top-level domain object, just give it some "own/create" attributes. This 
works cleaner and more uniformly than the current Mewa example.

One can sometimes force this onto the object, but this is often a mistake. 
e.g. if I have a class Person, each person can play many different roles 
(e.g. referred via attributes of other objects): author, father, project 
manager, ...

>> A meta-operation is an object carrying meta-information for a specific
>> operation that might be invoked on a specific object.
>
> OMG provides such a model called EMOF. Especially your code looks a
> lot like EMOF.

If I have joe with operation >>walk, then I have as many instances of the 
meta-operation >>walk on joe, as I have components that might invoke >>walk 
on joe.

EMOF does not have such a concept, afaik. Perhaps it is not sufficiently 
informed by Smalltalk-ish concepts like closures :-)

I don't really like the use of the word 'meta' here either, just borrowed 
what Mewa used. I prefer something like:
- objectReflection
- attributeReflection
- operationReflection

> When I started with Magritte I didn't know about this
> model, however I will try adapt Magritte to bring it closer to EMOF

Good to know, there may be tools you can then leverage.

>> In combination these three carry all the information needed to construct
>> components.
>
> I don't think so. My experience shows that this only works for very
> simple user interfaces and very simple domain models without much
> semantics and behvior, such as for an editor/viewer of a relational
> database.

Don't you think using operationReflection (expanded, of course) more fully 
could improve this? The kinds of patterns that show up in these semantics 
and behaviors are amenable to this, imho.

>>   joe -- meta-object
>>     joe#name -- meta-attribute
>>     joe#name= -- meta-operation
>>     joe#houses -- meta-attribute
>>       home -- meta-object
>>         home#address -- meta-attribute
>>           "123 hometown" -- metaobject, optimized away
>>         home#rooms -- meta-attribute
>>           room1 -- meta-object
>>           room2
>>       vacation_home
>>     joe#friends
>>       bob
>
> Both, Mewa and Magritte can do that. I am missing how the behavior
> fits in there you described at the beginning of your mail.

See joe#name=. I should have shown more operationReflection in the example. 
e.g.

(joe houses at: 1) metaOperationFor: #sell
could be another operationReflection.

These operationReflections correctly encapsulate parameters required, 
currently chosen of parameter values, available selections of parameter 
values, enabling/disabling of the operation, etc.

>> CLAIM: The component tree should exactly parallel this metaobject and
>> metaattribute structure (by default). So here are the components in that
>> tree, and the (meta)-things they connect to:
>
> The parallelity does not work in general as I explained above.

Hmm. Why not? There is a DOM-tree in the browser, and a parallel component 
tree in the server. All I am suggesting is that every node of the component 
tree be one of:
- objectNode -- attached to an objectReflection
- attributeNode -- attached to an attributeReflection
- operationNode -- attached to an operationReflection

>> As always, some of the elements in the above tree might change 
>> dynamically
>> with Ajax e.g. a viewer might be replaced by an editor when the little
>> "edit" link is clicked; but the editor would still be attached to the 
>> same
>> meta-instance.
>
> I have such an extension for Magritte, though it is (currently) only
> used in a commercial project.

Any plans to release it?

Is Magritte very experimental, or tested and robust?

>> I believe all the components in this tree could be generic by default, 
>> all
>> the meta-objects constructed automatically given a few meta-data hints.
>
> This doesn't work either. People need custom components for custom 
> projects.

True. Hopefully small, encapsulated deltas that can be composed. Once we 
work at the meta-level we need a set of operations to compose these 
meta-objects as objects and derive their resulting composite properties, 
including propagating defaults, overriding, adding/appending, etc. just like 
class inheritance is largely hard-coded today into class structure.

>> Not sure how Seaside deals with Ajax right now, but we might need some 
>> event
>> machinery between the tree and domain objects so an (Ajax) operation that
>> replaced one component might also update other parts of related 
>> components
>> in the tree. Ajax-induced updates would propagate up to the tree root
>> collecting component updates, before going back to the client.
>
> http://scriptaculous.seasidehosting.st

Looks nice!

Cheers,

Itsme :_)



More information about the Seaside mailing list