=================
zope.schema field
=================

To comply with zope.schema, gocept.reference has an own set field
which has the internally used InstrumentedSet class as type.

For demonstration purposes we create an interface which uses both
gocept.reference.field.Set and zope.schema.Set:

>>> import gocept.reference
>>> import gocept.reference.field
>>> import zope.annotation.interfaces
>>> import zope.interface
>>> import zope.schema
>>> import zope.schema.vocabulary
>>> dumb_vocab = zope.schema.vocabulary.SimpleVocabulary.fromItems(())
>>> class ICollector(zope.interface.Interface):
...     gr_items = gocept.reference.field.Set(
...         title=u'collected items using gocept.reference.field',
...         value_type=zope.schema.Choice(title=u'items', vocabulary=dumb_vocab)
...     )
...     zs_items = zope.schema.Set(
...         title=u'collected items using zope.schema',
...         value_type=zope.schema.Choice(title=u'items', vocabulary=dumb_vocab)
...     )

>>> class Collector(object):
...     zope.interface.implements(
...         ICollector, zope.annotation.interfaces.IAttributeAnnotatable)
...     gr_items = gocept.reference.ReferenceCollection()
...     zs_items = gocept.reference.ReferenceCollection()

>>> collector = Collector()
>>> collector.gr_items = set()
>>> collector.gr_items
InstrumentedSet([])
>>> collector.zs_items = set()
>>> collector.zs_items
InstrumentedSet([])

Successful valudation returns None but failing leads to an exception:

>>> ICollector['gr_items'].bind(collector).validate(collector.gr_items) is None
True
>>> ICollector['zs_items'].bind(collector).validate(collector.zs_items)
Traceback (most recent call last):
WrongType: (InstrumentedSet([]), <type 'set'>)
