zc.sourcefactory is very handy to easily create a source (zope.schema.interfaces.IIterableSource to be precise) with corresponding titles and tokens for its contents. Every now and then a source requires an explicit interface. For zc.sourcefactory the following code snippet helps:
class IMySource(zope.schema.interfaces.IIterableSource):
"""my source"""
class MySource(
zc.sourcefactory.contextual.BasicContextualSourceFactory):
"""The source factory."""
class source_class(
zc.sourcefactory.source.FactoredContextualSource):
"""This class is being instanciated by the factory.
It *must* be called source_class.
"""
zope.interface.implements(IMySource)
def getValues(self, context):
…
Of course it is also possible to declare the source_class separately from the source factory and reference it. But since its sole purpose is to hold an implements declaration, I’m fine with defining it inline.