code: def on_change(self, attr, *callbacks):
          ''' Add a callback on this object to trigger when ``attr`` changes.
  
          Args:
              attr (str) : an attribute name on this object
              callback (callable) : a callback function to register
  
          Returns:
              None
  
          '''
          if len(callbacks) == 0:
              raise ValueError("on_change takes an attribute name and one or more callbacks, got only one parameter")
  
          _callbacks = self._callbacks.setdefault(attr, [])
          for callback in callbacks:
  
              if callback in _callbacks:
                  continue
  
              _check_callback(callback, ('attr', 'old', 'new'))
  
              _callbacks.append(callbackf on_change(self, attr, *callbacks):
          ''' Add a callback on this object to trigger when ``attr`` changes.
  
          Args:
              attr (str) : an attribute name on this object
              callback (callable) : a callback function to register
  
          Returns:
              None
  
          '''
          if len(callbacks) == 0:
              raise ValueError("on_change takes an attribute name and one or more callbacks, got only one parameter")
  
          _callbacks = self._callbacks.setdefault(attr, [])
          for callback in callbacks:
  
              if callback in _callbacks:
                  continue
  
              _check_callback(callback, ('attr', 'old', 'new'))
  
              _callbacks.append(callback)
docs: Add a callback on this object to trigger when ``attr`` changes.
  
          Args:
              attr (str) : an attribute name on this object
              callback (callable) : a callback function to register
  
          Returns:
              None