def create_new_input_socket(self, param_name):
        """Create a new input socket.

        Works by creating an input socket representing
        a new subparameter.

        Parameters
        ==========
        param_name (string)
            name of the variable kind parameter for which
            we'll create a new subparameter.
        """
        ### retrieve subparam indices map for the parameter
        subparam_indices = self.data["subparam_map"][param_name]

        ### create a subparam index by going through the
        ### existing keys and incrementing the highest one

        ## try obtaining the highest the keys which
        ## represents the highest integer
        try:
            highest_key = max(subparam_indices)

        ## max will fail with a ValueError if the iterable
        ## it receives is empty (dict has no keys); in such
        ## case, use the default "0" as the subparameter
        ## name
        except ValueError:
            subparam_index = 0

        ## otherwise increment the highest key
        else:
            subparam_index = highest_key + 1

        ### append the new subparam index to the subparam
        ### names map for the parameter representing the
        ### socket data and also alias it in a local
        ### variable called "socket_data"
        subparam_indices.append(subparam_index)

        ### also retrieve the expected type of the
        ### parameter and use it to obtain a string
        ### representing a codename for the type;
        ###
        ### no type enforcement is ever performed,
        ### though

        expected_type = self.type_map[param_name]
        type_codename = type_to_codename(expected_type)

        ### instantiate input socket

        input_socket = InputSocket(
            node=self,
            type_codename=type_codename,
            parameter_name=param_name,
            subparameter_index=subparam_index,
        )

        ### store the input socket instance in the live
        ### instance map for input sockets (this custom
        ### dict subclass also need its "update" method
        ### executed whenever it is changed)

        self.input_socket_live_flmap[param_name][subparam_index] = input_socket
        self.input_socket_live_flmap.update()
Create a new input socket.

        Works by creating an input socket representing
        a new subparameter.

        Parameters
        ==========
        param_name (string)
            name of the variable kind parameter for which
            we'll create a new subparameter.
        
nodezator/graphman/callablenode/subparam/main.py