def manage_scrolling(self):
        """Scroll colliding arrow farthest from root.

        The root being the menu manager.

        The ordering is important, so even if arrows end up
        on top of each other, we scroll the correct one
        (the one on top, that is, the one farthest on the
        menu hierarchy, which is why it is drawn last and
        thus appears on top of the others).
        """
        ### admin task: create/reset a hovered_arrow
        ### to hold a hovered arrow if we find one
        self.hovered_arrow = None

        ### list all arrows from closest to menu manager to
        ### the farthest ones down the active branch
        all_arrows = self.gather_arrows(self, [])

        ### reverse the order, which makes the iteration
        ### start from the farthest one when iterating
        reversed_arrows = reversed(all_arrows)

        ### iterate over each arrow from the farthest one
        ### from the menu manager to the closest one; as
        ### soon as you find a colliding one, scroll it and
        ### stop iterating by breaking out of loop

        for arrow in reversed_arrows:

            if arrow.rect.collidepoint(self.mouse_pos):

                arrow.scroll()

                ## as an admin task, also store a reference
                ## to the collided arrow in the hovered_arrow
                ## attribute (it is used in other methods)
                self.hovered_arrow = arrow

                break
Scroll colliding arrow farthest from root.

        The root being the menu manager.

        The ordering is important, so even if arrows end up
        on top of each other, we scroll the correct one
        (the one on top, that is, the one farthest on the
        menu hierarchy, which is why it is drawn last and
        thus appears on top of the others).
        
nodezator/menu/scroll.py