def marshall(self, crypto_adaptor=None):
        thread = []
        root_nodes = []
        visited_nodes = set()
        tips = []
        signatures = {}

        # TODO Big issues will smash the stack
        def _process(node):
            if node in visited_nodes:
                log.debug("Bailing on visited node: %s" % (node))
                return
            visited_nodes.add(node)

            if crypto_adaptor:
                signature = self.get_signature(node)
                if signature:
                    signatures[node] = crypto_adaptor.verify(node, signature)

            obj = object_factory.hydrate_object(self.store[node].data)
            if isinstance(obj, RootObject):  # We've found a root
                root_nodes.append(obj)
                return
            for tip in obj.parents:
                _process(tip)
            thread.insert(0, obj)

        for tip in self:
            tips.append(tip)
            log.debug("Descending into %s" % (tip))
            _process(tip)
        return {
                "thread": thread,
                "roots": root_nodes,
                "tips": tips,
                "signatures": signatures
                }
Marshalls the gref into something renderable:
dataset/ETHPy150Open richo/groundstation/groundstation/gref.py/Gref.marshall