On Dec 21, 2009, at 6:16 PM, Luke Kanies wrote:
> On Dec 21, 2009, at 5:45 PM, Bruce Williams wrote:
>
>> On Dec 21, 2009, at 5:25 PM, Luke Kanies <[email protected]> wrote:
>>
>>> Hi all,
>>>
>>> Anyone have any complaints if I rename the 'indirector' class to
>>> 'router'?
>>>
>>> It's a much more appropriate and less frightening name.
>>
>> +1
>
> I'm actually doing this:
>
> s/Indirector/RouteManager/g
> s/Indirection/Router/g
> s/Terminus/Repository/g
>
> And looking into "fixing" the terminus/repository inheritance/
> registration ridiculousness.
>
> I'll post it all for feedback.
>
> This is being driven by the need to dynamically configure routes
> (i.e., change which repository is used for a given routed class).
> I'd prefer to get all of these renames done first, esp. since I've
> been using 'Route' and 'Router' in my stub branch for this work,
> which is an ugly naming conflict.
On the topic of the terminus/repository inheritance/registration
ridiculousness, I'll provide some extra context, and then explain why
I'm punting here.
The current model is rigid in multiple ways. Here's how it works
(using the new terminology):
There is a base 'Repository' class, and all repository classes have to
inherit from it. The ugly part is, everyone has to create what
amounts to an abstract subclass, and then each routed class needs its
own subclass, stored at router/$routed_class_name/$terminus_name. For
instance, we've got a RouteManager::Yaml class, and Node has a
subclass of it at route_manager/node/yaml.rb.
Crucially, the constant associated with this class is
Puppet::Node::Yaml. Note that the constant is outside the route
tree. This, plus the repository inheritance, are required to
correctly associate a given repository class with a given routed
class. We have to be able to map a given repository name and routed
class (e.g., the yaml repository for Node) to a file (so we know to
load route_manager/node/yaml.rb when we can't find the class) and also
to an actual class.
This tuple to class is done by having each subclass of a subclass
(i.e., the node/yaml subclass of the yaml subclass of repository)
register itself with the routed class. The human name is the last bit
of the constant -- 'yaml', in this case -- and the routed class is the
second to last bit of the constant -- node, in this case. So,
Repository gets its 'inherited' hook called, splits the constant,
finds the routed class by the second to last bit, and then registers
the class with it based on the last bit of the constant.
It seems like there really must be a common idiom for this process --
load classes on demand, and provide some simple mechanism to
automatically register those loaded classes with an appropriate
instance.
Because I don't actually have a better, simpler way to do this, and
because it's ugly but not hurtful, I'm punting on this and will just
build my routing support on top of these renames.
--
Never interrupt your enemy when he is making a mistake.
--Napolean Bonaparte
---------------------------------------------------------------------
Luke Kanies -|- http://reductivelabs.com -|- +1(615)594-8199
--
You received this message because you are subscribed to the Google Groups
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/puppet-dev?hl=en.