docs: def sync(self):
          """
          Synchronize the registered IP with the detected IP (if needed).
  
          This can be expensive, mostly depending on the detector, but also
          because updating the dynamic ip in itself is costly. Therefore, this
          method should usually only be called on startup or when the state changes.
          """
          detected_ip = self.detector.detect()
          if detected_ip is None:
              LOG.debug("Couldn't detect the current IP using detector %r", self.detector.names()[-1])
              # we don't have a value to set it to, so don't update! Still shouldn't happen though
          elif self.dns.detect() != detected_ip:
              LOG.info("%s: dns IP '%s' does not match detected IP '%s', updating",
                       self.updater.hostname, self.dns.get_current_value(), detected_ip)
              self.status = self.updater.update(detected_ip)
              self.plugins.after_remote_ip_update(detected_ip, self.status)
          else:
              self.status = 0
              LOG.debug("%s: nothing to do, dns '%s' equals detection '%s'",
                        self.updater.hostname,
                        self.dns.get_current_value(),
                        self.detector.get_current_value())