docs: def initiate(self, aspect=None, view=None, parent=None, officer=None):
          """Do not keep any reference to its parent,
          this way it can be garbage-collected."""
  
          def got_view(view):
              if view is None:
                  return None
              return init(view)
  
          def init(view):
              self.view = view
              d = self.call_mro("init")
              d.addCallback(retrieve_reference)
              d.addCallback(update_reference)
              return d
  
          def retrieve_reference(_param):
              if callable(self._model_reference):
                  context = self.make_context()
                  return self._model_reference(self.source, context)
              return self._model_reference
  
          def update_reference(reference):
              self.reference = reference
              return self
  
          if officer is not None:
              self.officer = IOfficer(officer)
          self.aspect = IAspect(aspect) if aspect is not None else None
          if self._model_view is not None:
              if callable(self._model_view):
                  context = self.make_context(view=view)
                  d = self._model_view(None, context)
                  return d.addCallback(got_view)
              return init(self._model_view)
          return init(view)