[Checkins] SVN: grokcore.component/branches/philikon-decl-dir-rules/src/grokcore/component/meta.py More science fiction and a rough sketch of the underlying implementation.

Philipp von Weitershausen philikon at philikon.de
Mon May 5 05:31:52 EDT 2008


Log message for revision 86437:
  More science fiction and a rough sketch of the underlying implementation.

Changed:
  U   grokcore.component/branches/philikon-decl-dir-rules/src/grokcore/component/meta.py

-=-
Modified: grokcore.component/branches/philikon-decl-dir-rules/src/grokcore/component/meta.py
===================================================================
--- grokcore.component/branches/philikon-decl-dir-rules/src/grokcore/component/meta.py	2008-05-05 09:06:43 UTC (rev 86436)
+++ grokcore.component/branches/philikon-decl-dir-rules/src/grokcore/component/meta.py	2008-05-05 09:31:52 UTC (rev 86437)
@@ -100,12 +100,15 @@
     # happens, since it relies on the ITemplateFileFactories being grokked.
     priority = 1100
 
-    class directives:
-        direct = grokcore.component.direct.bind()
-        provides = grokcore.component.provides.bind(
-            default_global_utility_provides)
-        name = grokcore.component.name.bind()
+    directives = [
+        grokcore.component.direct.bind(),
+        grokcore.component.provides.bind(
+            get_default=default_global_utility_provides),
+        grokcore.component.provides.bind(default=IFoo),
+        grokcore.component.name.bind(),
+        ]
 
+
     def register(self, factory, config, direct, provides, name):
         if not direct:
             factory = factory()
@@ -118,6 +121,46 @@
         return True
 
 
+    def grok(self, name, factory, module_info, config, **kw):
+        module = module_info.getModule()
+
+        # Populate the data dict with information from the directives:
+        data = {}
+        for bound_directive in self.directives:
+            data[dirname] = bound_directive.get(factory, module, **data)
+        return self.register(factory, config, **data)
+
+
+class Directive(...):
+
+    @classmethod
+    def bind(cls, default=None, get_default=None, name=None):
+        return BoundDirective(cls, default, get_default, name)
+
+
+class BoundDirective(object):
+
+    def __init__(self, directive, default=None, get_default=None, name=None):
+        self.directive = directive
+        self.default = default
+        if name is None:
+            name = directive.__name__
+        self.name = name
+        if get_default is not None:
+            self.get_default = get_default
+
+    def get_default(self, component, module, **data):
+        if self.default is not None:
+            return self.default
+        return self.directive.default
+
+    def get(self, component, module, **data):
+        value = self.directive.get(component, module, default=_DEFAULT)
+        if value is _DEFAULT:
+            value = self.get_default(component, module, **data)
+        return value
+
+
 class AdapterDecoratorGrokker(martian.GlobalGrokker):
 
     def grok(self, name, module, module_info, config, **kw):



More information about the Checkins mailing list