# Source code for fontTools.ttLib.ttVisitor

    """Specialization of fontTools.misc.visitor to work with TTFont."""

    from fontTools.misc.visitor import Visitor
    from fontTools.ttLib import TTFont

    class TTVisitor(Visitor):

        def visitAttr(self, obj, attr, value, *args, **kwargs):
            if isinstance(value, TTFont):
                return False
            super().visitAttr(obj, attr, value, *args, **kwargs)

        def visit(self, obj, *args, **kwargs):
            if hasattr(obj, "ensureDecompiled"):
                obj.ensureDecompiled(recurse=False)
            super().visit(obj, *args, **kwargs)

    @TTVisitor.register(TTFont)
    def visit(visitor, font, *args, **kwargs):
        # Some objects have links back to TTFont; even though we
        # have a check in visitAttr to stop them from recursing
        # onto TTFont, sometimes they still do, for example when
        # someone overrides visitAttr.
        if hasattr(visitor, "font"):
            return False

        visitor.font = font
        for tag in font.keys():
            visitor.visit(font[tag], *args, **kwargs)
        del visitor.font
        return False