def instantiate_nodes(self):
        """Instantiate node widgets.

        This is done so they can be used to execute the node
        layout.
        """
        ### create map to store node objects
        node_map = self.node_map = {}

        ### reference the callable map locally
        node_def_map = APP_REFS.node_def_map

        ### also create a list to hold missing node script
        ### ids, in case there's any
        missing_ids = []

        ### instantiate and store nodes in the map

        for node_data in self.nodes_data.values():

            if "script_id" in node_data:

                script_id = node_data["script_id"]

                ## try retrieving the node defining object
                ## from the corresponding map

                try:
                    node_def_obj = node_def_map[script_id]

                ## if a KeyError is raised, store the missing
                ## id and skip the processing of this item
                ## using the 'continue' statement; a custom
                ## error will be raised after exiting the
                ## loop to report the missing ids found

                except KeyError:

                    missing_ids.append(script_id)
                    continue

                ## if otherwise you retrieve the node
                ## defining object successfully,
                ## instantiate and store the node

                else:
                    node_map[node_data["id"]] = CallableNode(
                        node_def_obj,
                        node_data,
                    )

            elif "operation_id" in node_data:

                node_map[node_data["id"]] = OperatorNode(node_data)

            elif "builtin_id" in node_data:
                node_map[node_data["id"]] = BuiltinNode(node_data)

            elif "stlib_id" in node_data:
                node_map[node_data["id"]] = StandardLibNode(node_data)

            elif "thirdlib_id" in node_data:
                node_map[node_data["id"]] = ThirdLibNode(node_data)

            elif "capsule_id" in node_data:
                node_map[node_data["id"]] = CapsuleNode(node_data)

            elif "genviewer_id" in node_data:
                node_map[node_data["id"]] = GeneralViewerNode(node_data)

            else:
                node_map[node_data["id"]] = ProxyNode(node_data)

        ### TODO
        ### this should be dealt with in the GUI to help
        ### the user; we would probably present a custom
        ### message listing the missing scripts, telling
        ### the user how to solve the problem and
        ### probably offering the option to return to
        ### 'no file' state, etc.
        ###
        ### edit: at the present time, we automatically
        ### return to the 'no file' state

        ### if there are missing ids, report them by
        ### raising a custom error

        if missing_ids:
            raise MissingNodeScriptsError(missing_ids)

        ### create a special object from the __iter__
        ### method of the node map values() view;
        ###
        ### such special iterable provides extra control
        ### over the objects in the view; it also provides
        ### extra functionality, including blitting
        ### operations;

        self.nodes = Iterable2D(node_map.values().__iter__)
Instantiate node widgets.

        This is done so they can be used to execute the node
        layout.
        
nodezator/graphman/main.py