def addObserver(self, target, attr=None, callback=None):
        """ Register 'target' for changes in the config var named by section and name.
        When the config is changed, calls setattr with target and attr.
        attr may be None; it will be created from the name by lowercasing the first
        word, uppercasing the rest, and removing spaces.
        e.g. "block buffer" becomes "blockBuffer"
        """
        observers = self.config.observers.setdefault((self.section, self.name), {})
        if not attr:
            attr = self.key
        log.debug("Subscribing %s.%s", target, attr)

        attr = intern(str(attr))
        targetref = weakref.ref(target)
        observers.setdefault((targetref, attr), callback)

        val = self.get()

        setattr(target, attr, val)
        if callback:
            callback(val)
 Register 'target' for changes in the config var named by section and name.
        When the config is changed, calls setattr with target and attr.
        attr may be None; it will be created from the name by lowercasing the first
        word, uppercasing the rest, and removing spaces.
        e.g. "block buffer" becomes "blockBuffer"
        
config.py