added some experimental stuff for self-registering adapters using a metaclass
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2465 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
		
							parent
							
								
									2ff4d5ac22
								
							
						
					
					
						commit
						872fccc529
					
				
					 2 changed files with 49 additions and 0 deletions
				
			
		|  | @ -56,3 +56,29 @@ class AdapterFactory(object): | |||
|         if adapter is None: | ||||
|             return None | ||||
|         return adapter(obj) | ||||
| 
 | ||||
| 
 | ||||
| # self-registering adapters | ||||
| 
 | ||||
| adapters = AdapterFactory() | ||||
| 
 | ||||
| 
 | ||||
| class AdapterType(type): | ||||
|     """ To be used as metaclass for self-registering adapters. | ||||
|     """ | ||||
| 
 | ||||
|     def __init__(cls, name, bases, cdict): | ||||
|         super(AdapterType, cls).__init__(name, bases, cdict) | ||||
|         info = list(cdict.get('__adapterinfo__', (adapters, object, ''))) | ||||
|         if len(info) < 2: | ||||
|             info.append(object) | ||||
|         if len(info) < 3: | ||||
|             info.append('') | ||||
|         factory, adapted, name = info | ||||
|         factory.register(cls, adapted, name) | ||||
| 
 | ||||
| 
 | ||||
| class AdapterBase: | ||||
| 
 | ||||
|     __metaclass__ = AdapterType | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,6 +7,10 @@ $Id$ | |||
| To work with adapters we need at least two classes, one for objects | ||||
| that we want to adapt to (the adapter's `context`) and one for the adapters. | ||||
| 
 | ||||
| 
 | ||||
| Adapter Classes and Factories | ||||
| ============================= | ||||
| 
 | ||||
|   >>> class Content(object): | ||||
|   ...     pass | ||||
| 
 | ||||
|  | @ -100,3 +104,22 @@ example above. | |||
|   >>> c2 | ||||
|   <Content object ...> | ||||
| 
 | ||||
| 
 | ||||
| Self-registering Adapters | ||||
| ========================= | ||||
| 
 | ||||
|   >>> from cybertools.util.adapter import adapters, AdapterBase | ||||
|   >>> stateful = AdapterFactory() | ||||
| 
 | ||||
|   >>> class StateAdapter(AdapterBase): | ||||
|   ...     __adapterinfo__ = stateful, Content | ||||
|   ...     def __init__(self, context): | ||||
|   ...         self.context = context | ||||
|   ...     def setState(self, state): | ||||
|   ...         self.context._state = state | ||||
|   ...     def getState(self): | ||||
|   ...         return getattr(self.context, '_state', 'initial') | ||||
| 
 | ||||
|   >>> stateful._registry | ||||
|   {(<class 'Content'>, ''): <class 'StateAdapter'>} | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 helmutm
						helmutm