[Grok-dev] Re: Grok nomenclature

Martijn Faassen faassen at startifact.com
Wed Apr 30 11:56:42 EDT 2008


Martin Aspeli wrote:
[snip]
> The point is that we need a convention that's (a) visually appealing (b) 
> clear and (c) consistent, so that we don't end up with 100 different 
> ways of doing the same thing, making it hard to figure out what 
> components actually get registered when you work with a complex package 
> with potentially dozens of grokked things.

I think we should investigate a way to signal that we want 
auto-registration for existing classes (that you now register using ZCML).

That is, if you say:

from plone.app.portlets.portlets import base

class MyPortletAssignment(base.Assignment):
     pass

nothing happens. You register using ZCML or not at all; Grok won't care.

If you say:

import grok
from plone.app.portlets.portelts import base

class MyPortletAssignment(base.Assignment):
     grok.grokked()

It'll be grokked (if a grokker was registered for base.Assignment of 
course). 'grok.grokked()' just adds the IGrokked interface to these 
classes. You then are supposed to use directives where needed.

These directives can be defined by grok. In this case the semantics of 
these directives should be the same, or very similar, to the semantics 
of the directives as used in Grok ('grok.context()' should not suddenly 
be used to set the view name, say).

Sometimes you need domain-specific directives. Let's imagine you need a 
'pipeline' directive (purely imaginary), and this is entirely portlet 
specific. Then you'd do:

import grok
from plone.app.portlets.portlets import base

class MyPortletAssignment(base.Assignment):
     grok.grokked()
     base.pipeline("Whatever")

It should be clear to the reader of the code that this is a class-level 
directive - there's nothing else it could be doing, and people should be 
able to recognize class directives as they're well familiar with 
zope.interface.implements().

This will allow domain-specific extensions to the Grok language to be in 
their own namespace, and there won't be an explosion of classes, one for 
non-grok and one for grok, where this is not necessary. If ZCML can 
register it, one should be able to register it with Grok too.

The requirements for extensions to the Grok domain specific language:

* avoid there being a "ZCML class" and a "Grok class". No explosion of 
base classes. Of course if there's no base class at all yet for the ZCML 
case we are fine.

* clearly signal to the reader of the code that things are being grokked.

* don't expand the 'grok.' namespace. What's in there is defined by Grok 
(and five.grok follows that). Separate namespaces are a good thing, and 
monkey-patching import namespaces is bad.

* there being a way to evolve an application from the use of ZCML to the 
use of Grok, without changing everything at once.

* reuse grok directives where it makes sense

* introduce new directives where that makes sense, and import the 
directives from the same place as the base classes. I think these things 
should be semantically near.

If this means that you end up importing directives and base classes from 
10 different modules in a package, I think it's time to start 
refactoring the package and consolidating the places you need to import 
from into one.

Regards,

Martijn



More information about the Grok-dev mailing list