Creates a factor that itself creates an output node, and ensures that the plate for the output node exists
        along with all relevant meta-data

        :param tool: The tool
        :param source: The source node
        :param output_plate: The details of the plate that will be created (dict)
        :param plate_manager: The hyperstream plate manager
        :type output_plate: dict
        :type plate_manager: PlateManager
        :return: The created factor

def create_node_creation_factor(self, tool, source, output_plate, plate_manager):
        """
        Creates a factor that itself creates an output node, and ensures that the plate for the output node exists
        along with all relevant meta-data

        :param tool: The tool
        :param source: The source node
        :param output_plate: The details of the plate that will be created (dict)
        :param plate_manager: The hyperstream plate manager
        :type output_plate: dict
        :type plate_manager: PlateManager
        :return: The created factor
        """
        # if isinstance(tool, dict):
        #     tool = self.channels.get_tool(**tool)

        if not isinstance(tool, PlateCreationTool):
            raise ValueError("Expected PlateCreationTool, got {}".format(type(tool)))

        input_plates = source.plates if source else []

        if len(input_plates) > 1:
            raise NotImplementedError

        factor = NodeCreationFactor(
            tool=tool,
            source_node=source,
            input_plate=input_plates[0] if input_plates else None,
            output_plate=output_plate,
            plate_manager=plate_manager
        )

        self._add_factor(factor)
        return factor