code: def fire_service_event(self, event):
          
          # Get the service properties
          properties = event.get_service_reference().get_properties()
          svc_specs = properties[OBJECTCLASS]
          previous = None
          endmatch_event = None
          svc_modified = event.get_kind() == ServiceEvent.MODIFIED
  
          if svc_modified:
              # Modified service event : prepare the end match event
              previous = event.get_previous_properties()
              endmatch_event = ServiceEvent(
                  ServiceEvent.MODIFIED_ENDMATCH,
                  event.get_service_reference(),
                  previous,
              )
  
          with self.__svc_lock:
              # Get the listeners for this specification
              listeners = set()
              for spec in svc_specs:
                  try:
                      listeners.update(self.__svc_listeners[spec])
                  except KeyError:
                      pass
  
              # Add those which listen to any specification
              try:
                  listeners.update(self.__svc_listeners[None])
              except KeyError:
                  pass
  
          # Filter listeners with EventListenerHooks
          listeners = self._filter_with_hooks(event, listeners)
  
          # Get the listeners for this specification
          for data in listeners:
              # Default event to send : the one we received
              sent_event = event
  
              # Test if the service properties matches the filter
              ldap_filter = data.ldap_filter
              if ldap_filter is not None and not ldap_filter.matches(properties):
                  # Event doesn't match listener filter...
                  if (
                      svc_modified
                      and previous is not None
                      and ldap_filter.matches(previous)
                  ):
                      # ... but previous properties did match
                      sent_event = endmatch_event
                  else:
                      # Didn't match before either, ignore it
                      continue
  
              # Call'em
              try:
                  data.listener.service_changed(sent_event)
              except:
                  self._logger.exception("Error calling a service listener")
docs: Notifies service events listeners of a new event in the calling thread.
  
          :param event: The service event