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)