Skip to content

Instantly share code, notes, and snippets.

@lvh
Created July 20, 2012 08:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lvh/3149470 to your computer and use it in GitHub Desktop.
Save lvh/3149470 to your computer and use it in GitHub Desktop.
class ComposedLocator(object):
"""
A responder locator that consists of other locators.
"""
interface.implements(amp.IResponderLocator)
class __metaclass__(type):
def __new__(meta, name, bases, attrs):
"""
Makes sure every subclass gets its own set of locator classes.
"""
attrs["_locatorClasses"] = []
return type.__new__(meta, name, bases, attrs)
def __init__(self, *args, **kwargs):
self._locators = [l(*args, **kwargs) for l in self._locatorClasses]
def locateResponder(self, name):
"""
Locates a responder from all the component responders.
"""
for locator in self._locators:
responder = locator.locateResponder(name)
if responder is not None:
return responder
@classmethod
def component(cls, locatorClass):
"""
Registers a component locator.
"""
cls._locatorClasses.append(locatorClass)
return locatorClass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment