[Zope3-checkins] CVS: Zope3/src/zope/app/component - metadirectives.py:1.1 contentdirective.py:1.4 meta.zcml:1.8 metaconfigure.py:1.13

Philipp von Weitershausen philikon@philikon.de
Sat, 2 Aug 2003 03:04:36 -0400


Update of /cvs-repository/Zope3/src/zope/app/component
In directory cvs.zope.org:/tmp/cvs-serv29115/component

Modified Files:
	contentdirective.py meta.zcml metaconfigure.py 
Added Files:
	metadirectives.py 
Log Message:
Converted the three most important packages that define ZCML directives
to the new ZCML architecture (using schemas):

- zope.app.component

- zope.app.browser

- zope.app.publisher.browser


=== Added File Zope3/src/zope/app/component/metadirectives.py ===
##############################################################################
#
# Copyright (c) 2001, 2002 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""
$Id: metadirectives.py,v 1.1 2003/08/02 07:04:01 philikon Exp $
"""

from zope.interface import Interface
from zope.configuration.fields import GlobalObject, Tokens, Path, \
     PythonIdentifier
from zope.schema import Text, TextLine

class IBasicComponentInformation(Interface):

    component = GlobalObject(
        title=u"Component to be used",
        required=False
        )

    permission = TextLine(
        title=u"Permission",
        required=False
        )

    factory = GlobalObject(
        title=u"Factory",
        required=False
        )

class IBasicViewInformation(Interface):
    """
    This is the basic information for all views.
    """

    for_ = GlobalObject(
        title=u"The interface this view applies to.",
        description=u"""
        The view will be for all objects that implement this
        interface. If this is not supplied, the view applies to all
        objects (XXX this ought to change).""",
        required=False
        )

    permission = TextLine(
        title=u"Permission",
        description=u"The permission needed to use the view.",
        required=False
        )

    class_ = GlobalObject(
        title=u"Class",
        description=u"A class that provides attributes used by the view.",
        required=False
        )

    layer = TextLine(
        title=u"The layer the view is in.",
        description=u"""
        A skin is composed of layers. It is common to put skin
        specific views in a layer named after the skin. If the 'layer'
        attribute is not supplied, it defaults to 'default'.""",
        required=False
        )

    allowed_interface = Tokens(
        title=u"Interface that is also allowed if user has permission.",
        description=u"""
        By default, 'permission' only applies to viewing the view and
        any possible sub views. By specifying this attribute, you can
        make the permission also apply to everything described in the
        supplied interface.

        Multiple interfaces can be provided, separated by
        whitespace.""",
        required=False,
        value_type=GlobalObject()
        )

    allowed_attributes = Tokens(
        title=u"View attributes that are also allowed if user has permission.",
        description=u"""
        By default, 'permission' only applies to viewing the view and
        any possible sub views. By specifying 'allowed_attributes',
        you can make the permission also apply to the extra attributes
        on the view object.""",
        required=False,
        value_type=PythonIdentifier()
        )

class IBasicResourceInformation(Interface):
    """
    Basic information for resources
    """

    name = TextLine(
        title=u"The name of the resource.",
        description=u"The name shows up in URLs/paths. For example 'foo'.",
        required=True
        )

    type = GlobalObject(
        title=u"Type of the resource",
        required=True
        )

class IInterfaceDirective(Interface):
    """
    Define an interface
    """
    
    interface = GlobalObject(
        title=u"Interface",
        required=True
        )

class IAdapterDirective(Interface):
    """
    Register an adapter
    """

    factory = Tokens(
        title=u"Adapter factory/factories",
        required=True,
        value_type=GlobalObject()
        )

    provides = GlobalObject(
        title=u"Interface the component provides",
        required=True
        )

    for_ = GlobalObject(
        title=u"Interface the component is used for",
        required=True
        )

    permission = TextLine(
        title=u"Permission",
        required=False
        )

    name = TextLine(
        title=u"Name",
        required=False
        )

class IUtilityDirective(IBasicComponentInformation):
    """
    Register a utility
    """

    provides = GlobalObject(
        title=u"Interface the component provides",
        required=True
        )

    name = TextLine(
        title=u"Name",
        required=False
        )

class IFactoryDirective(Interface):
    """
    Define a factory
    """

    component = GlobalObject(
        title=u"Component to be used",
        required=True
        )
    
    id = TextLine(
        title=u"ID",
        required=False
        )

    permission = TextLine(
        title=u"Permission",
        required=False
        )

class IViewDirective(IBasicViewInformation, IBasicResourceInformation):
    """
    Register a view for a component
    """

    factory = Tokens(
        title=u"Factory",
        required=False,
        value_type=GlobalObject()
        )

class IResourceDirective(IBasicComponentInformation, IBasicResourceInformation):
    """
    Register a resource
    """
    
    layer = TextLine(
        title=u"The layer the resource is in.",
        required=False
        )

    allowed_interface = Tokens(
        title=u"Interface that is also allowed if user has permission.",
        required=False,
        value_type=GlobalObject()
        )

    allowed_attributes = Tokens(
        title=u"View attributes that are also allowed if user has permission.",
        required=False,
        value_type=PythonIdentifier()
        )

class ISkinDirective(IBasicResourceInformation):
    """
    Register a skin
    """

    layers = Tokens(
        title=u"The layers it consists of.",
        required=True,
        value_type=TextLine()
        )

class IServiceTypeDirective(Interface):

    id = TextLine(
        title=u"ID of the service type",
        required=True
        )

    interface = GlobalObject(
        title=u"Interface of the service type",
        required=True
        )

class IServiceDirective(IBasicComponentInformation):
    """
    Register a service
    """

    serviceType = TextLine(
        title=u"ID of service type",
        required=True
        )

class IClassDirective(Interface):
    """
    Make statements about a class
    """

    class_ = GlobalObject(
        title=u"Class",
        required=True
        )

class IImplementsSubdirective(Interface):
    """
    Declare that the class given by the content directive's class
    attribute implements a given interface
    """

    interface = Tokens(
        title=u"One or more interfaces",
        required=True,
        value_type=GlobalObject()
        )

class IRequireSubdirective(Interface):
    """
    Indicate that the a specified list of names or the names in a
    given Interface require a given permission for access.
    """

    permission = TextLine(
        title=u"Permission",
        required=False
        )

    attributes = Tokens(
        title=u"Attributes",
        required=False,
        value_type=PythonIdentifier()
        )
        
    set_attributes = Tokens(
        title=u"Attributes that can be set",
        required=False,
        value_type=PythonIdentifier()
        )

    interface = Tokens(
        title=u"Interface",
        required=False,
        value_type=GlobalObject()
        )

    set_schema = Tokens(
        title=u"The attributes specified by the schema can be set",
        required=False,
        value_type=GlobalObject()
        )

    like_class = GlobalObject(
        title=u"Configure like this class",
        required=False
        )
    
class IAllowSubdirective(Interface):
    """
    Declare a part of the class to be publicly viewable (that is,
    requires the zope.Public permission). Only one of the following
    two attributes may be used.
    """

    attributes = Tokens(
        title=u"Attributes",
        required=False,
        value_type=PythonIdentifier()
        )

    interface = Tokens(
        title=u"Interface",
        required=False,
        value_type=GlobalObject()
        )

class IFactorySubdirective(Interface):
    """
    Specify the factory used to create this content object
    """

    id = TextLine(
        title=u"ID",
        description=u"""
        the identifier for this factory in the ZMI factory
        identification scheme.  If not given, defaults to the literal
        string given as the content directive's 'class' attribute.""",
        required=False
        )

    permission = TextLine(
        title=u"Permission",
        description=u"""
        permission id required to use this factory.  Although
        optional, this attribute should normally be specified.""",
        required=False
        )

    title = TextLine(
        title=u"Title",
        description=u"""
        text suitable for use in the 'add content' menu of a
        management interface""",
        required=False
        )

    description = Text(
        title=u"Description",
        description=u"Longer narrative description of what this factory does",
        required=False
        )


=== Zope3/src/zope/app/component/contentdirective.py 1.3 => 1.4 ===
--- Zope3/src/zope/app/component/contentdirective.py:1.3	Mon Jul 28 18:21:05 2003
+++ Zope3/src/zope/app/component/contentdirective.py	Sat Aug  2 03:04:01 2003
@@ -21,9 +21,7 @@
 from zope.component import getService
 from zope.app.services.servicenames import Interfaces, Factories
 from zope.configuration.exceptions import ConfigurationError
-from zope.configuration.action import Action
 from zope.app.component.classfactory import ClassFactory
-from zope.app.component.metaconfigure import resolveInterface
 from zope.app.security.protectclass \
     import protectLikeUnto, protectName, protectSetAttribute
 from zope.app.security.registries.permissionregistry import permissionRegistry
@@ -50,7 +48,7 @@
 
     def __init__(self, _context, class_):
         self.__id = class_
-        self.__class = _context.resolve(class_)
+        self.__class = class_
         if isinstance(self.__class, ModuleType):
             raise ConfigurationError('Content class attribute must be a class')
         # not used yet
@@ -59,137 +57,119 @@
         self.__context = _context
 
     def implements(self, _context, interface):
-        r = []
-        for interface in interface.strip().split():
-
-            resolved_interface = resolveInterface(_context, interface)
-            r += [
-                Action(
-                    discriminator = (
-                        'ContentDirective', self.__class, object()),
-                    callable = classImplements,
-                    args = (self.__class, resolved_interface),
-                    ),
-                Action(
-                   discriminator = None,
-                   callable = handler,
-                   args = (Interfaces, 'provideInterface',
-                           resolved_interface.__module__+
-                           '.'+
-                           resolved_interface.__name__,
-                           resolved_interface)
-                   )
-                ]
-        return r
+        for interface in interface:
+            _context.action(
+                discriminator = (
+                'ContentDirective', self.__class, object()),
+                callable = classImplements,
+                args = (self.__class, interface),
+                )
+            _context.action(
+                discriminator = None,
+                callable = handler,
+                args = (Interfaces, 'provideInterface',
+                        interface.__module__+
+                        '.'+
+                        interface.__name__,
+                        interface)
+                )
 
     def require(self, _context,
                 permission=None, attributes=None, interface=None,
                 like_class=None, set_attributes=None, set_schema=None):
         """Require a the permission to access a specific aspect"""
-
         if like_class:
-            r = self.__mimic(_context, like_class)
-        else:
-            r = []
+            self.__mimic(_context, like_class)
 
         if not (interface or attributes or set_attributes or set_schema):
-            if r:
-                return r
+            if like_class:
+                return
             raise ConfigurationError("Nothing required")
 
         if not permission:
             raise ConfigurationError("No permission specified")
 
-
         if interface:
-            for i in interface.strip().split():
-                self.__protectByInterface(i, permission, r)
+            for i in interface:
+                if i:
+                    self.__protectByInterface(i, permission)
         if attributes:
-            self.__protectNames(attributes, permission, r)
+            self.__protectNames(attributes, permission)
         if set_attributes:
-            self.__protectSetAttributes(set_attributes, permission, r)
+            self.__protectSetAttributes(set_attributes, permission)
         if set_schema:
-            for s in set_schema.strip().split():
-                self.__protectSetSchema(s, permission, r)
-
-
-        return r
+            for s in set_schema:
+                self.__protectSetSchema(s, permission)
 
     def __mimic(self, _context, class_):
         """Base security requirements on those of the given class"""
-        class_to_mimic = _context.resolve(class_)
-        return [
-            Action(discriminator=('mimic', self.__class, object()),
-                   callable=protectLikeUnto,
-                   args=(self.__class, class_to_mimic),
-                   )
-            ]
+        _context.action(
+            discriminator=('mimic', self.__class, object()),
+            callable=protectLikeUnto,
+            args=(self.__class, class_),
+            )
 
     def allow(self, _context, attributes=None, interface=None):
         """Like require, but with permission_id zope.Public"""
         return self.require(_context, PublicPermission, attributes, interface)
 
-
-
-    def __protectByInterface(self, interface, permission_id, r):
+    def __protectByInterface(self, interface, permission_id):
         "Set a permission on names in an interface."
-        interface = resolveInterface(self.__context, interface)
         for n, d in interface.namesAndDescriptions(1):
-            self.__protectName(n, permission_id, r)
-        r.append(
-            Action(
-               discriminator = None,
-               callable = handler,
-               args = (Interfaces, 'provideInterface',
-                       interface.__module__+ '.'+ interface.__name__,
-                       interface)
-               )
+            self.__protectName(n, permission_id)
+        self.__context.action(
+            discriminator = None,
+            callable = handler,
+            args = (Interfaces, 'provideInterface',
+                    interface.__module__+ '.'+ interface.__name__,
+                    interface)
             )
 
-    def __protectName(self, name, permission_id, r):
+    def __protectName(self, name, permission_id):
         "Set a permission on a particular name."
-        r.append((
-            ('protectName', self.__class, name),
-            protectName, (self.__class, name, permission_id)))
+        self.__context.action(
+            discriminator = ('protectName', self.__class, name),
+            callable = protectName,
+            args = (self.__class, name, permission_id)
+            )
 
-    def __protectNames(self, names, permission_id, r):
+    def __protectNames(self, names, permission_id):
         "Set a permission on a bunch of names."
-        for name in names.split():
-            self.__protectName(name.strip(), permission_id, r)
+        for name in names:
+            self.__protectName(name, permission_id)
 
-    def __protectSetAttributes(self, names, permission_id, r):
+    def __protectSetAttributes(self, names, permission_id):
         "Set a permission on a bunch of names."
-        for name in names.split():
-            r.append((
-                ('protectSetAttribute', self.__class, name),
-                protectSetAttribute, (self.__class, name, permission_id)))
+        for name in names:
+            self.__context.action(
+                discriminator = ('protectSetAttribute', self.__class, name),
+                callable = protectSetAttribute,
+                args = (self.__class, name, permission_id)
+                )
 
-    def __protectSetSchema(self, schema, permission_id, r):
+    def __protectSetSchema(self, schema, permission_id):
         "Set a permission on a bunch of names."
-        schema = resolveInterface(self.__context, schema)
+        _context = self.__context
         for name in schema:
             field = schema[name]
             if IField.isImplementedBy(field) and not field.readonly:
-                r.append((
-                    ('protectSetAttribute', self.__class, name),
-                    protectSetAttribute, (self.__class, name, permission_id)))
-
-        r.append(
-            Action(
-               discriminator = None,
-               callable = handler,
-               args = (Interfaces, 'provideInterface',
-                       schema.__module__+ '.'+ schema.__name__,
-                       schema)
-               )
+                _context.action(
+                    discriminator = ('protectSetAttribute', self.__class, name),
+                    callable = protectSetAttribute,
+                    args = (self.__class, name, permission_id)
+                    )
+        _context.action(
+            discriminator = None,
+            callable = handler,
+            args = (Interfaces, 'provideInterface',
+                    schema.__module__+ '.'+ schema.__name__,
+                    schema)
             )
 
-
     def __call__(self):
         "Handle empty/simple declaration."
         return ()
 
-
     def factory(self, _context,
                 permission=None, title="", id=None, description=''):
         """Register a zmi factory for this class"""
@@ -199,14 +179,12 @@
         # note factories are all in one pile, services and content,
         # so addable names must also act as if they were all in the
         # same namespace, despite the service/content division
-        return [
-            Action(
-                discriminator = ('FactoryFromClass', id),
-                callable = provideClass,
-                args = (id, self.__class,
-                        permission, title, description)
-                )
-            ]
+        _context.action(
+            discriminator = ('FactoryFromClass', id),
+            callable = provideClass,
+            args = (id, self.__class,
+                    permission, title, description)
+            )
 
 def provideClass(id, _class, permission=None,
                  title='', description=''):


=== Zope3/src/zope/app/component/meta.zcml 1.7 => 1.8 ===
--- Zope3/src/zope/app/component/meta.zcml:1.7	Mon Jul 28 18:21:16 2003
+++ Zope3/src/zope/app/component/meta.zcml	Sat Aug  2 03:04:01 2003
@@ -1,261 +1,125 @@
-<zopeConfigure xmlns='http://namespaces.zope.org/zope'>
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:meta="http://namespaces.zope.org/meta">
+
+  <meta:directives namespace="http://namespaces.zope.org/zope">
+
+    <meta:directive
+        name="interface"
+        schema=".metadirectives.IInterfaceDirective"
+        handler="zope.app.component.metaconfigure.interface"
+        />
+
+    <meta:directive
+        name="adapter"
+        schema=".metadirectives.IAdapterDirective"
+        handler="zope.app.component.metaconfigure.adapter"
+        />
+
+    <meta:directive
+        name="utility"
+        schema=".metadirectives.IUtilityDirective"
+        handler="zope.app.component.metaconfigure.utility"
+        />
+
+    <meta:directive
+        name="factory"
+        schema=".metadirectives.IFactoryDirective"
+        handler="zope.app.component.metaconfigure.factory"
+        />
+
+    <meta:directive
+        name="view"
+        schema=".metadirectives.IViewDirective"
+        handler="zope.app.component.metaconfigure.view"
+        />
+
+    <meta:directive
+        name="defaultView"
+        schema=".metadirectives.IViewDirective"
+        handler="zope.app.component.metaconfigure.defaultView"
+        />
+
+    <meta:directive
+        name="resource"
+        schema=".metadirectives.IResourceDirective"
+        handler="zope.app.component.metaconfigure.resource"
+        />
+
+    <meta:directive
+        name="skin"
+        schema=".metadirectives.ISkinDirective"
+        handler="zope.app.component.metaconfigure.skin"
+        />
+
+    <meta:directive
+        name="serviceType"
+        schema=".metadirectives.IServiceTypeDirective"
+        handler="zope.app.component.metaconfigure.serviceType"
+        />
+
+    <meta:directive
+        name="service" 
+        schema=".metadirectives.IServiceDirective"
+        handler="zope.app.component.metaconfigure.service"
+        />
 
-  <directives namespace="http://namespaces.zope.org/zope">
-
-    <directive name="interface" attributes="interface"
-       handler="zope.app.component.metaconfigure.interface" />
-
-    <directive name="adapter" 
-               attributes="factory provides for permission name"
-       handler="zope.app.component.metaconfigure.adapter" />
-
-    <directive name="utility" 
-               attributes="component provides permission name factory"
-       handler="zope.app.component.metaconfigure.utility" />
-
-    <directive name="factory" attributes="component id permission"
-       handler="zope.app.component.metaconfigure.factory" />
-
-    <directive
-       name="view"
-       attributes="component type name for layer factory
-                   permission allowed_interface allowed_attributes"
-       handler="zope.app.component.metaconfigure.view" />
+    <meta:complexDirective
+        name="class"
+        schema=".metadirectives.IClassDirective"
+        handler="zope.app.component.contentdirective.ContentDirective"
+        >
 
-    <directive name="defaultView"
-               attributes="component type name for layer factory
-                           permission allowed_attributes"
-       handler="zope.app.component.metaconfigure.defaultView" />
+      <meta:subdirective
+          name="implements"
+          schema=".metadirectives.IImplementsSubdirective"
+          />
 
-    <directive
-       name="resource"
-       attributes="component type name layer factory
-                   permission allowed_interface allowed_attributes"
-       handler="zope.app.component.metaconfigure.resource" />
+      <meta:subdirective
+          name="require"
+          schema=".metadirectives.IRequireSubdirective"
+          />
 
-    <directive name="skin" attributes="name type layers"
-        handler="zope.app.component.metaconfigure.skin" />
+      <meta:subdirective
+          name="allow"
+          schema=".metadirectives.IAllowSubdirective"
+          />
 
-    <directive name="serviceType" attributes="id interface"
-       handler="zope.app.component.metaconfigure.serviceType" />
+      <meta:subdirective
+          name="factory"
+          schema=".metadirectives.IFactorySubdirective"
+          />
 
-    <directive name="service" 
-               attributes="serviceType component permission factory"
-       handler="zope.app.component.metaconfigure.service" />
+    </meta:complexDirective>
 
-    <directive
+    <meta:complexDirective
         name="content"
+        schema=".metadirectives.IClassDirective"
         handler="zope.app.component.contentdirective.ContentDirective"
-        description="Make a component available as a content object type"
         >
-      <attribute
-          name="class"
-          required="yes"
-          description="resolvable name of a class"
-          />
-
-      <subdirective name="implements">
 
-        <description>
-              Declare that the class given by the content
-              directive's class attribute implements a given interface
-          </description>
-
-        <attribute
-            name="interface"
-            required="yes"
-            description="resolvable name of an Interface"
-            />
-      </subdirective>
-
-      <subdirective name="require">
-        <description>
-            Indicate that the a specified list of names or the
-            names in a given Interface require a given permission for
-            access.
-          </description>
-
-        <attribute
-            name="permission"
-            required="no"
-            description="a permission id"
-            />
-
-        <attribute
-            name="attributes"
-            description="space-separated list of attribute names"
-            />
-
-        <attribute
-            name="set_attributes"
-            description="space-separated list of attribute names
-                         for attributes that can be set"
-            />
-
-        <attribute
-            name="set_schema"
-            >
-            Dotted name of a schema
-
-            The non-read-only fields in the schema can be set with the
-            specified permission.
-            
-          </attribute>
-
-        <attribute
-            name="interface"
-            description="the resolvable name of an interface"
-            />
-
-        <attribute name="like_class">
-          <description>
-                a class on which the security requirements
-                for this class will be based
-              </description>
-          </attribute>
-
-      </subdirective>
-
-      <subdirective name="allow">
-        <description>
-              Declare a part of the class to be publicly
-              viewable (that is, requires the zope.Public
-              permission).  Only one of the following two
-              attributes may be used.
-           </description>
-
-        <attribute
-            name="attributes"
-            description="space-separated list of attribute names"
-            />
-
-        <attribute
-            name="interface"
-            description="the resolvable name of an interface"
-            />
-
-      </subdirective>
-
-      <subdirective name="factory">
-
-        <description>
-              Specify the factory used to create this
-              content object
-          </description>
-
-        <attribute name="permission">
-          <description>
-                permission id required to use this factory.
-                Although optional, this attribute should normally
-                be specified.
-                </description>
-          </attribute>
-
-        <attribute name="id">
-          <description>
-                the identifier for this factory in the
-                ZMI factory identification scheme.  If not given, defaults
-                to the literal string given as the content directive's
-                'class' attribute.
-              </description>
-          </attribute>
-
-        <attribute name="title">
-          <description>
-                text suitable for use in the 'add content' menu of
-                a management interface
-              </description>
-          </attribute>
-
-        <attribute name="description">
-          <description>
-                longer narrative description of what this
-                factory does
-            </description>
-          </attribute>
-
-      </subdirective>
-    </directive>
-
-    <directive
-        name="class"
-        handler="zope.app.component.contentdirective.ContentDirective"
-        description="Make statements about a class"
-        >
-      <attribute
-          name="class"
-          required="yes"
-          description="resolvable name of a class"
+      <meta:subdirective
+          name="implements"
+          schema=".metadirectives.IImplementsSubdirective"
           />
 
-      <subdirective name="implements">
+      <meta:subdirective
+          name="require"
+          schema=".metadirectives.IRequireSubdirective"
+          />
 
-        <description>
-              Declare that the class given by the content
-              directive's class attribute implements a given interface
-          </description>
-
-        <attribute
-            name="interface"
-            required="yes"
-            description="resolvable name of an Interface"
-            />
-      </subdirective>
-
-      <subdirective name="require">
-        <description>
-            Indicate that the a specified list of names or the
-            names in a given Interface require a given permission for
-            access.
-          </description>
-
-        <attribute
-            name="permission"
-            required="yes"
-            description="a permission id"
-            />
-
-        <attribute
-            name="attributes"
-            description="space-separated list of attribute names"
-            />
-
-        <attribute
-            name="interface"
-            description="the resolvable name of an interface"
-            />
-
-        <attribute name="like_class">
-          <description>
-                a class on which the security requirements
-                for this class will be based
-              </description>
-          </attribute>
-
-      </subdirective>
-
-      <subdirective name="allow">
-        <description>
-              Declare a part of the class to be publicly
-              viewable (that is, requires the zope.Public
-              permission).  Only one of the following two
-              attributes may be used.
-           </description>
-
-        <attribute
-            name="attributes"
-            description="space-separated list of attribute names"
-            />
-
-        <attribute
-            name="interface"
-            description="the resolvable name of an interface"
-            />
+      <meta:subdirective
+          name="allow"
+          schema=".metadirectives.IAllowSubdirective"
+          />
 
-      </subdirective>
+      <meta:subdirective
+          name="factory"
+          schema=".metadirectives.IFactorySubdirective"
+          />
 
-    </directive>
+    </meta:complexDirective>
 
-  </directives>
+  </meta:directives>
 
-</zopeConfigure>
+</configure>


=== Zope3/src/zope/app/component/metaconfigure.py 1.12 => 1.13 ===
--- Zope3/src/zope/app/component/metaconfigure.py:1.12	Fri Jun 20 18:00:21 2003
+++ Zope3/src/zope/app/component/metaconfigure.py	Sat Aug  2 03:04:01 2003
@@ -11,6 +11,9 @@
 # FOR A PARTICULAR PURPOSE.
 #
 ##############################################################################
+"""
+$Id$
+"""
 
 from zope.configuration.exceptions import ConfigurationError
 from zope.security.proxy import Proxy, ProxyFactory
@@ -18,7 +21,6 @@
 from zope.app.services.servicenames import Adapters, Interfaces, Skins
 from zope.app.services.servicenames import Views, Resources, Factories
 from zope.app.component.globalinterfaceservice import interfaceService
-from zope.configuration.action import Action
 from zope.security.checker import InterfaceChecker, CheckerPublic, \
      Checker, NamesChecker
 from zope.app.security.registries.permissionregistry import permissionRegistry
@@ -55,71 +57,42 @@
     method(*args, **kwargs)
 
 def interface(_context, interface):
-    interface = resolveInterface(_context, interface)
-    return [
-        Action(
-          discriminator = None,
-          callable = handler,
-          args = (Interfaces, 'provideInterface', '', interface)
-        ),
-      ]
-
+    _context.action(
+        discriminator = None,
+        callable = handler,
+        args = (Interfaces, 'provideInterface', '', interface)
+        )
 
 def adapter(_context, factory, provides, for_, permission=None, name=''):
-    if for_ == '*':
-        for_ = None
-    elif not for_:
-        raise ValueError(
-            "A for interface must be provided. Use * for all objects.")
-
-    if for_:
-        for_ = resolveInterface(_context, for_)
-
-    provides = resolveInterface(_context, provides)
-    factory = map(_context.resolve, factory.split())
-
     if permission is not None:
         if permission == PublicPermission:
             permission = CheckerPublic
         checker = InterfaceChecker(provides, permission)
         factory.append(lambda c: Proxy(c, checker))
-    actions=[
-        Action(
-            discriminator = ('adapter', for_, provides, name),
-            callable = checkingHandler,
-            args = (permission, Adapters, 'provideAdapter',
-                    for_, provides, factory, name),
-               ),
-        Action(
-            discriminator = None,
-            callable = handler,
-            args = (Interfaces, 'provideInterface', '', provides)
-              )
-              ]
+    _context.action(
+        discriminator = ('adapter', for_, provides, name),
+        callable = checkingHandler,
+        args = (permission, Adapters, 'provideAdapter',
+                for_, provides, factory, name),
+        )
+    _context.action(
+        discriminator = None,
+        callable = handler,
+        args = (Interfaces, 'provideInterface', '', provides)
+        )
     if for_ is not None:
-        actions.append
-        (
-        Action(
+        _context.action(
             discriminator = None,
             callable = handler,
             args = (Interfaces, 'provideInterface', '', for_)
-              )
-         )
-
-    return actions
-
+            )
 
 def utility(_context, provides, component=None, factory=None,
             permission=None, name=''):
-    provides = resolveInterface(_context, provides)
-
     if factory:
         if component:
             raise TypeError("Can't specify factory and component.")
-
-        component = _context.resolve(factory)()
-    else:
-        component = _context.resolve(component)
+        component = factory()
 
     if permission is not None:
         if permission == PublicPermission:
@@ -128,35 +101,25 @@
 
         component = Proxy(component, checker)
 
-    return [
-        Action(
-            discriminator = ('utility', provides, name),
-            callable = checkingHandler,
-            args = (permission, 'Utilities', 'provideUtility',
-                    provides, component, name),
-            ),
-        Action(
-            discriminator = None,
-            callable = handler,
-            args = (Interfaces, 'provideInterface',
-                    provides.__module__+'.'+provides.__name__, provides)
-              )
-        ]
-
+    _context.action(
+        discriminator = ('utility', provides, name),
+        callable = checkingHandler,
+        args = (permission, 'Utilities', 'provideUtility',
+                provides, component, name),
+        )
+    _context.action(
+        discriminator = None,
+        callable = handler,
+        args = (Interfaces, 'provideInterface',
+                provides.__module__+'.'+provides.__name__, provides)
+        )
 
 def factory(_context, component, id=None, permission=None):
-    if id is None:
-        id = component
-
-    component = _context.resolve(component)
-
-    return [
-        Action(
-            discriminator = ('factory', id),
-            callable = provideFactory,
-            args = (id, component, permission),
-            )
-        ]
+    _context.action(
+        discriminator = ('factory', id),
+        callable = provideFactory,
+        args = (id, component, permission),
+        )
 
 def provideFactory(name, factory, permission):
     # make sure the permission is defined
@@ -168,13 +131,13 @@
 
     if permission:
         # XXX should getInterfaces be public, as below?
-        factory = ProxyFactory(factory,
-                               NamesChecker(('getInterfaces',),
-                                            __call__=permission))
-
+        factory = ProxyFactory(
+            factory,
+            NamesChecker(('getInterfaces',),
+                         __call__=permission)
+            )
     getService(None, Factories).provideFactory(name, factory)
 
-
 def _checker(_context, permission, allowed_interface, allowed_attributes):
     if (not allowed_attributes) and (not allowed_interface):
         allowed_attributes = "__call__"
@@ -183,14 +146,15 @@
         permission = CheckerPublic
 
     require={}
-    for name in (allowed_attributes or '').split():
-        require[name] = permission
-    if allowed_interface:
-        for name in resolveInterface(_context, allowed_interface).names(all=True):
+    if allowed_attributes:
+        for name in allowed_attributes:
             require[name] = permission
+    if allowed_interface:
+        for i in allowed_interface:
+            for name in i.names(all=True):
+                require[name] = permission
 
     checker = Checker(require.get)
-
     return checker
 
 def resource(_context, factory, type, name, layer='default',
@@ -204,11 +168,6 @@
             "allowed_attributes"
             )
 
-
-    type = _context.resolve(type)
-    factory = _context.resolve(factory)
-
-
     if permission:
 
         checker = _checker(_context, permission,
@@ -219,20 +178,18 @@
 
         factory = proxyResource
 
-    return [
-        Action(
-            discriminator = ('resource', name, type, layer),
-            callable = checkingHandler,
-            args = (permission, Resources,'provideResource',
-                    name, type, factory, layer),
-            ),
-        Action(
-            discriminator = None,
-            callable = handler,
-            args = (Interfaces, 'provideInterface',
-                    type.__module__+'.'+type.__name__, type)
-              )
-        ]
+    _context.action(
+        discriminator = ('resource', name, type, layer),
+        callable = checkingHandler,
+        args = (permission, Resources,'provideResource',
+                name, type, factory, layer),
+        )
+    _context.action(
+        discriminator = None,
+        callable = handler,
+        args = (Interfaces, 'provideInterface',
+                type.__module__+'.'+type.__name__, type)
+        )
 
 def view(_context, factory, type, name, for_, layer='default',
          permission=None, allowed_interface=None, allowed_attributes=None):
@@ -247,11 +204,6 @@
             "allowed_attributes"
             )
 
-    if for_ is not None:
-        for_ = resolveInterface(_context, for_)
-    type = _context.resolve(type)
-
-    factory = map(_context.resolve, factory.strip().split())
     if not factory:
         raise ConfigurationError("No view factory specified.")
 
@@ -265,33 +217,27 @@
 
         factory[-1] = proxyView
 
-    actions=[
-        Action(
-            discriminator = ('view', for_, name, type, layer),
-            callable = checkingHandler,
-            args = (permission, Views,'provideView', for_, name,
-                    type, factory, layer),
-            ),
-        Action(
-            discriminator = None,
-            callable = handler,
-            args = (Interfaces, 'provideInterface',
-                    type.__module__+'.'+type.__name__, type)
-            )
-            ]
+    _context.action(
+        discriminator = ('view', for_, name, type, layer),
+        callable = checkingHandler,
+        args = (permission, Views,'provideView', for_, name,
+                type, factory, layer),
+        )
+    _context.action(
+        discriminator = None,
+        callable = handler,
+        args = (Interfaces, 'provideInterface',
+                type.__module__+'.'+type.__name__, type)
+        )
+
     if for_ is not None:
-        actions.append
-        (
-        Action(
+        _context.action(
             discriminator = None,
             callable = handler,
             args = (Interfaces, 'provideInterface',
                     for_.__module__+'.'+for_.__name__,
                     for_)
-              )
-         )
-
-    return actions
+            )
 
 def defaultView(_context, type, name, for_, **__kw):
 
@@ -299,55 +245,40 @@
         for_ = None
 
     if __kw:
-        actions = view(_context, type=type, name=name, for_=for_, **__kw)
-    else:
-        actions = []
-
-    if for_ is not None:
-        for_ = resolveInterface(_context, for_)
-    type = _context.resolve(type)
+        view(_context, type=type, name=name, for_=for_, **__kw)
 
-    actions += [
-        Action(
+    _context.action(
         discriminator = ('defaultViewName', for_, type, name),
         callable = handler,
         args = (Views,'setDefaultViewName', for_, type, name),
-        ),
-        Action(
-            discriminator = None,
-            callable = handler,
-            args = (Interfaces, 'provideInterface',
-                    type.__module__+'.'+type.__name__, type)
-            )
-               ]
+        )
+    _context.action(
+        discriminator = None,
+        callable = handler,
+        args = (Interfaces, 'provideInterface',
+                type.__module__+'.'+type.__name__, type)
+        )
+
     if for_ is not None:
-        actions.append
-        (
-        Action(
+        _context.action(
             discriminator = None,
             callable = handler,
             args = (Interfaces, 'provideInterface',
                     for_.__module__+'.'+for_.__name__, for_)
-              )
-         )
-
-    return actions
+            )
 
 def serviceType(_context, id, interface):
-    interface = resolveInterface(_context, interface)
-    return [
-        Action(
-            discriminator = ('serviceType', id),
-            callable = managerHandler,
-            args = ('defineService', id, interface),
-            ),
-        Action(
-            discriminator = None,
-            callable = provideInterface,
-            args = (interface.__module__+'.'+interface.__name__,
-                    interface)
-            )
-        ]
+    _context.action(
+        discriminator = ('serviceType', id),
+        callable = managerHandler,
+        args = ('defineService', id, interface),
+        )
+    _context.action(
+        discriminator = None,
+        callable = provideInterface,
+        args = (interface.__module__+'.'+interface.__name__,
+                interface)
+        )
 
 def provideService(serviceType, component, permission):
     # This is needed so we can add a security proxy.
@@ -357,7 +288,6 @@
     service_manager = getServiceManager(None)
 
     if permission:
-
         for stype, interface in service_manager.getServiceDefinitions():
             if stype == serviceType:
                 break
@@ -382,39 +312,33 @@
         if component:
             raise TypeError("Can't specify factory and component.")
 
-        component = _context.resolve(factory)()
-    else:
-        component = _context.resolve(component)
-
-    return [
-        Action(
-            discriminator = ('service', serviceType),
-            callable = provideService,
-            args = (serviceType, component, permission),
-            )
-        ]
+        component = factory()
+
+    _context.action(
+        discriminator = ('service', serviceType),
+        callable = provideService,
+        args = (serviceType, component, permission),
+        )
 
 def skin(_context, name, layers, type):
-    type = _context.resolve(type)
     if ',' in layers:
         raise TypeError("Commas are not allowed in layer names.")
 
-    layers = layers.strip().split()
-    actions = [
-        Action(
-            discriminator = ('skin', name, type),
-            callable = handler,
-            args = (Skins,'defineSkin',name, type, layers)
-              ),
-        Action(
-            discriminator = None,
-            callable = handler,
-            args = (Interfaces, 'provideInterface',
-                    type.__module__+'.'+type.__name__, type)
-              )
-             ]
-    return actions
+    _context.action(
+        discriminator = ('skin', name, type),
+        callable = handler,
+        args = (Skins,'defineSkin',name, type, layers)
+        )
+
+    _context.action(
+        discriminator = None,
+        callable = handler,
+        args = (Interfaces, 'provideInterface',
+                type.__module__+'.'+type.__name__, type)
+        )
 
+# XXX this will have to incorporated into
+# zope.configuration.fields.GlobalObject
 def resolveInterface(_context, id):
     interface = interfaceService.queryInterface(id, None)
     if interface is None: