Call an execution module with the given arguments and keyword arguments

        .. code-block:: python

            caller.cmd('test.arg', 'Foo', 'Bar', baz='Baz')

            caller.cmd('event.send', 'myco/myevent/something',
                data={'foo': 'Foo'}, with_env=['GIT_COMMIT'], with_grains=True)

def cmd(self, fun, *args, **kwargs):
        '''
        Call an execution module with the given arguments and keyword arguments

        .. code-block:: python

            caller.cmd('test.arg', 'Foo', 'Bar', baz='Baz')

            caller.cmd('event.send', 'myco/myevent/something',
                data={'foo': 'Foo'}, with_env=['GIT_COMMIT'], with_grains=True)
        '''
        func = self.sminion.functions[fun]
        data = {
          'arg': args,
          'fun': fun
        }
        data.update(kwargs)
        executors = getattr(self.sminion, 'module_executors', []) or \
                    self.opts.get('module_executors', ['direct_call'])
        if isinstance(executors, six.string_types):
            executors = [executors]
        for name in executors:
            fname = '{0}.execute'.format(name)
            if fname not in self.sminion.executors:
                raise SaltInvocationError("Executor '{0}' is not available".format(name))
            return_data = self.sminion.executors[fname](self.opts, data, func, args, kwargs)
            if return_data is not None:
                break
        return return_data