[TransWarp] PROPOSAL: Namespace unification: binding, naming, config

Phillip J. Eby pje at telecommunity.com
Sun Jul 7 22:33:08 EDT 2002

While working on finishing the design of PEAK's configuration system this 
weekend, it occurred to me that there was a distinct similarity between 
three kinds of trees in PEAK: binding.Component trees, naming.Context 
trees, and config.Stack trees.  All involve some type of "inheritance" or 
"acquisitional" context.

It occurs to me that there isn't any reason for naming.Context objects to 
use a separate "environment" or "configuration" parameter.  They could just 
become binding.Components themselves.  Although by default, 
binding.Components are only instantiated as named attributes of their 
parent component, they will work just fine as an independent object that 
just has a pointer to a parent.

Similarly, although we've been talking about the configuration stack as 
though it were something that lived outside the component tree, it 
similarly could live inside it... as a kind of default root object for 
components which do not otherwise have a parent.

And coming full circle, the binding system doesn't need to pass a 
configuration object or parameter to the naming system in order to tell it 
where a lookup is relative to; it can just bind the initial context object 
as a child component of the component.  Heck, objects can freely keep 
around an initial context object bound to themselves, if they want; they're 
not very heavyweight.

What we end up with, instead, is a simple interface, something like 
getConfigSetting(propertyname), that's available on all 
binding.Components.  The default implementation would look things up in a 
dictionary associated with the component, and if not found, delegate the 
inquiry to the parent component, unless there is none, in which case 
request a lookup of the default configuration object, and delegate to 
that.  Components at each level can potentially cache their response.

In practice, I think it'll actually need two methods, one for the 
"external" interface, with schema checking and handling of defaults, and 
one for the "internal" interface that handles the delegation, wrapping 
return values with an audit trail to monitor the origin of the 
configuration setting, and caching.

All of this brings up a new and interesting possibility: "style 
sheets".  Think of how CSS defines properties for the components of a 
document tree, with selectors that identify an object by class, ID, or 
context relative to other objects.  The "unified tree theory" of PEAK would 
let us define a similar mechanism, but the properties could be literally 
any configuration property at all.  And the same mechanism could be used as 
a style sheet for a GUI application, as a set of business rules for 
security or workflow properties in a hierarchical context, or just about 
anything else.

I haven't given much thought to this style sheet idea as yet, and I don't 
plan on trying to have it all figured out before implementing a basic 
configuration-acquiring interface.  But I do want the initial system to 
support a very limited sort of "pushing" of configuration settings: a 
component should be able to define a binding for one of its attributes that 
specifies bindings for parameters of the child object.  Right now, the only 
way to do this is to subclass the child object as a nested class in the 
parent object's class.  It would be nice to be able to specify 
configurations that will apply, regardless of the actual class that ends up 
filling the spot.  This is important for the naming system in particular, 
where the exact class of Context object is not going to be known ahead of 
time, even though the component that needs the context knows what settings 
it wants to supply to that context.

More information about the PEAK mailing list