==================
Member information
==================

Before we can start, we need to set up the principal annotation
utility and the ``IAnnotations`` adapter for principals:

  >>> from zope.component import provideUtility
  >>> from zope.app.principalannotation import PrincipalAnnotationUtility
  >>> from zope.app.principalannotation.interfaces import \
  ...     IPrincipalAnnotationUtility
  >>> utility = PrincipalAnnotationUtility()
  >>> provideUtility(utility, IPrincipalAnnotationUtility)

  >>> from zope.component import provideAdapter
  >>> from zope.app.principalannotation import annotations
  >>> provideAdapter(annotations)

Now we can start.  As a principal object, we simply use a dummy
implementation.  All it really needs is an ID so that the utility can
identify it:

  >>> from zope.security.interfaces import IPrincipal
  >>> from zope.interface import implements
  >>> class DummyPrincipal(object):
  ...     implements(IPrincipal)
  ...     id = "sloopy_joe"
  >>> sloppy_joe = DummyPrincipal()

With this principal object we invoke the ``IMemberInfo`` adapter and
store some user metadata on it:

  >>> from worldcookery.memberinfo import MemberInfo
  >>> info = MemberInfo(sloppy_joe)
  >>> info.first = u"Sloppy"
  >>> info.last = u"Joe"
  >>> info.email = u"sloppyjoe@usafood.com"

Not surprisingly, retrieving the information works just as well:

  >>> info.first, info.last, info.email
  (u'Sloppy', u'Joe', u'sloppyjoe@usafood.com')

The utility instance has stored our data in the ``IAnnotations``
object:

  >>> utility.hasAnnotations(sloppy_joe)
  True
  >>> annotations = utility.getAnnotations(sloppy_joe)
  >>> items = list(annotations['worldcookery.memberinfo'].items())
  >>> items.sort()
  >>> tuple(items)
  (('email', u'sloppyjoe@usafood.com'), ('first', u'Sloppy'), ('last', u'Joe'))
