code: def call_method(self, service, path, interface, method, signature=None,
                      args=None, no_reply=False, auto_start=False, timeout=-1):
          
          message = txdbus.MethodCallMessage(path, method, interface=interface,
                                  destination=service, signature=signature, body=args,
                                  expectReply=not no_reply, autoStart=auto_start)
          serial = message.serial
          if timeout == -1:
              timeout = self._timeout
          try:
              with switch_back(timeout) as switcher:
                  self._method_calls[serial] = switcher
                  self.send_message(message)
                  args, _ = self._hub.switch()
          finally:
              self._method_calls.pop(serial, None)
          response = args[0]
          assert response.reply_serial == serial
          if isinstance(response, txdbus.ErrorMessage):
              raise DbusMethodCallError(method, response)
          args = tuple(response.body) if response.body else ()
          return args
docs: Call a D-BUS method and wait for its reply.
  
          This method calls the D-BUS method with name *method* that resides on
          the object at bus address *service*, at path *path*, on interface
          *interface*.
  
          The *signature* and *args* are optional arguments that can be used to
          add parameters to the method call. The signature is a D-BUS signature
          string, while *args* must be a sequence of python types that can be
          converted into the types specified by the signature. See the `D-BUS
          specification
          <http://dbus.freedesktop.org/doc/dbus-specification.html>`_ for a
          reference on signature strings.
  
          The flags *no_reply* and *auto_start* control the NO_REPLY_EXPECTED and
          NO_AUTO_START flags on the D-BUS message.
  
          The return value is the result of the D-BUS method call. This will be a
          possibly empty sequence of values.