def Introspect(self, object_path, connection):
        '''Return XML description of this object's interfaces, methods and signals.
        This wraps dbus-python's Introspect() method to include the dynamic
        methods and properties.
        '''
        cls = self.__class__.__module__ + '.' + self.__class__.__name__
        orig_interfaces = self._dbus_class_table[cls]
        mock_interfaces = orig_interfaces.copy()
        for interface, methods in self.methods.items():
            for method in methods:
                mock_interfaces.setdefault(interface, {})[method] = self.methods[interface][method][3]
        self._dbus_class_table[cls] = mock_interfaces
        xml = dbus.service.Object.Introspect(self, object_path, connection)
        tree = ElementTree.fromstring(xml)
        for name in self.props:
            interface = tree.find(".//interface[@name='%s']" % name)
            if interface is None:
                interface = ElementTree.Element("interface", {"name": name})
                tree.append(interface)
            for prop, val in self.props[name].items():
                if val is None:
                    continue
                elem = ElementTree.Element("property", {
                    "name": prop,
                    "type": dbus.lowlevel.Message.guess_signature(val),
                    "access": "readwrite"})
                interface.append(elem)
        xml = ElementTree.tostring(tree, encoding='utf8', method='xml').decode('utf8')
        self._dbus_class_table[cls] = orig_interfaces
        return xml