def MI_invokeMethod(self, env, objectName, methodName, inputParams):
        # pylint: disable=invalid-name
        """Invoke an extrinsic method.

        Implements the InvokeMethod WBEM operation by calling the
        method on a derived class called cim_method_<method_name>,
        where <method_name> is the name of the CIM method, in all
        lower case.

        Arguments:
        env -- Provider Environment (pycimmb.ProviderEnvironment)
        objectName -- The InstanceName or ClassName of the object on
        which the method is invoked.
        methodName -- The name of the method to be invoked.
        inputParams -- A Dictionary where the key is the parameter name
            and the value is the parameter value.

        The return value for invokeMethod must be a tuple of size 2
        where:
        element 0 is a tuple of size 2 where element 0 is the return
            data type name and element 1 is the actual data value.
        element 1 is a dictionary where the key is the output
            parameter name and the value is a tuple of size 2 where
            element 0 is the data type name for the output parameter
            and element 1 is the actual value of the output parameter.

        A derived class will not normally override this method.

        """

        logger = env.get_logger()
        logger.log_debug('CIMProvider2 MI_invokeMethod called. ' \
                         'method: %s:%s' % (objectName.classname, methodName))
        lmethName = "cim_method_%s" % methodName.lower()
        if hasattr(self, lmethName):
            method = getattr(self, lmethName)
            new_inputs = dict([('param_%s' % k.lower(), v) \
                            for k, v in inputParams.items()])
            try:
                (rval, outs) = method(env=env, object_name=objectName,
                                      **new_inputs)
            except TypeError as exc:
                raise pywbem.CIMError(pywbem.CIM_ERR_INVALID_PARAMETER, str(exc))

            def add_type(v):
                if isinstance(v, pywbem.CIMParameter):
                    return (v.type, v.value)
                lv = v
                if type(v) == list and len(v) > 0:
                    lv = v[0]
                if isinstance(lv, pywbem.CIMClass):
                    tp = 'class'
                elif isinstance(lv, pywbem.CIMInstance):
                    tp = 'instance'
                elif isinstance(lv, pywbem.CIMInstanceName):
                    tp = 'reference'
                elif v is None or (type(v) == list and len(v) == 0):
                    assert(None == 'This should not happen')
                else:
                    tp = cimtype(v)
                return (tp, v)

            louts = {}
            for op in outs:
                louts[op.name] = (op.type, op.value)
            rval = add_type(rval)
            rval = (rval, louts)
        else:
            raise pywbem.CIMError(
                pywbem.CIM_ERR_METHOD_NOT_FOUND,
                "%s:%s"%(objectName.classname, methodName))
        logger.log_debug('CIMProvider2 MI_invokeMethod returning')
        return rval
Invoke an extrinsic method.

        Implements the InvokeMethod WBEM operation by calling the
        method on a derived class called cim_method_<method_name>,
        where <method_name> is the name of the CIM method, in all
        lower case.

        Arguments:
        env -- Provider Environment (pycimmb.ProviderEnvironment)
        objectName -- The InstanceName or ClassName of the object on
        which the method is invoked.
        methodName -- The name of the method to be invoked.
        inputParams -- A Dictionary where the key is the parameter name
            and the value is the parameter value.

        The return value for invokeMethod must be a tuple of size 2
        where:
        element 0 is a tuple of size 2 where element 0 is the return
            data type name and element 1 is the actual data value.
        element 1 is a dictionary where the key is the output
            parameter name and the value is a tuple of size 2 where
            element 0 is the data type name for the output parameter
            and element 1 is the actual value of the output parameter.

        A derived class will not normally override this method.