0001"""
0002Dict that has a callback on all updates
0003"""
0004
0005class UpdateDict(dict):
0006    updated = None
0007    updated_args = None
0008    def _updated(self):
0009        """
0010        Assign to new_dict.updated to track updates
0011        """
0012        updated = self.updated
0013        if updated is not None:
0014            args = self.updated_args
0015            if args is None:
0016                args = (self,)
0017            updated(*args)
0018    def __setitem__(self, key, item):
0019        dict.__setitem__(self, key, item)
0020        self._updated()
0021    def __delitem__(self, key):
0022        dict.__delitem__(self, key)
0023        self._updated()
0024    def clear(self):
0025        dict.clear(self)
0026        self._updated()
0027    def update(self, *args, **kw):
0028        dict.update(self, *args, **kw)
0029        self._updated()
0030    def setdefault(self, key, failobj=None):
0031        dict.setdefault(self, key, failobj)
0032        self._updated()
0033    def pop(self):
0034        v = dict.pop(self)
0035        self._updated()
0036        return v
0037    def popitem(self):
0038        v = dict.popitem(self)
0039        self._updated()
0040        return v