def build_scrolling_objects(self):
        """Build objects to support scrolling.

        Only called if menu items go out of the boundaries
        defined upon instantiation (defaults to the screen
        boundaries).

        In addition to build the new objects, we also
        reposition the children inside the scroll area
        created here.

        Note: the entire hierarchy of children will also
        need repositioning, but this will be done at the end
        of the menu manager __init__ method.
        """
        if self.is_menubar:

            ### create arrow objects (left and right arrows),
            ### assigning appropriate surfaces and their
            ### rects to them

            left_arrow = Object2D(
                image=LEFT_ARROW_SURF, rect=LEFT_ARROW_SURF.get_rect()
            )

            right_arrow = Object2D(
                image=RIGHT_ARROW_SURF, rect=RIGHT_ARROW_SURF.get_rect()
            )

            ### get the their combined width
            arrows_width = left_arrow.rect.width + right_arrow.rect.width

            ### calculate the dimensions for the scrollable
            ### area and create it

            scrollable_width = self.max_width - arrows_width
            height = self.children[0].rect.height
            dimensions = scrollable_width, height

            self.scroll_area = Rect((0, 0), dimensions)

            ### reference scroll methods on the arrows

            left_arrow.scroll = self.scroll_left
            right_arrow.scroll = self.scroll_right

            ### store both arrows in attributes

            self.left_arrow = left_arrow
            self.right_arrow = right_arrow

            ### also store them together in a container
            self.arrows = self.left_arrow, self.right_arrow

        else:

            ### create arrow objects (up and down arrows),
            ### assigning appropriate surfaces and their
            ### rects to them

            up_arrow = Object2D(image=UP_ARROW_SURF, rect=UP_ARROW_SURF.get_rect())

            down_arrow = Object2D(
                image=DOWN_ARROW_SURF, rect=DOWN_ARROW_SURF.get_rect()
            )

            ## get their combined height
            arrows_height = up_arrow.rect.height + down_arrow.rect.height

            ## calculate the dimensions for the scrollable
            ## area and create it

            scrollable_height = self.max_height - arrows_height
            width = self.children[0].rect.width
            dimensions = width, scrollable_height

            self.scroll_area = Rect((0, 0), dimensions)

            ### expand the up and down arrow surfaces and
            ### rects horizontally so that they fit the
            ### scroll_area width

            ## define width and height of arrows (height
            ## is preserved as can be seen)

            arrows_width = self.scroll_area.width
            arrows_height = up_arrow.rect.height

            ## replace arrows surfaces by new ones,
            ## blitting the original surfaces right on the
            ## middle of the new surfaces

            for arrow in (up_arrow, down_arrow):

                ## backup the original surface
                original_surf = arrow.image

                ## replace by new one

                arrow.image = render_rect(arrows_width, arrows_height, MENU_BG)

                ## blit original over the new one

                blit_aligned(
                    surface_to_blit=original_surf,
                    target_surface=arrow.image,
                    retrieve_pos_from="center",
                    assign_pos_to="center",
                )

                ## update size of arrow's rect
                arrow.rect.size = arrow.image.get_size()

            ### reference scroll methods on the respective
            ### arrows

            up_arrow.scroll = self.scroll_up
            down_arrow.scroll = self.scroll_down

            ### store both arrows in attributes

            self.up_arrow = up_arrow
            self.down_arrow = down_arrow

            ### also store them together in a container
            self.arrows = self.up_arrow, self.down_arrow

        ### finally reposition all the new object and the
        ### children inside the menu manager
        self.reposition_menu_manager_contents()
Build objects to support scrolling.

        Only called if menu items go out of the boundaries
        defined upon instantiation (defaults to the screen
        boundaries).

        In addition to build the new objects, we also
        reposition the children inside the scroll area
        created here.

        Note: the entire hierarchy of children will also
        need repositioning, but this will be done at the end
        of the menu manager __init__ method.
        
nodezator/menu/scroll.py