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
              *callbacks (callable) : callback functions to register
  
          Returns:
              None
  
          Example:
  
          .. code-block:: python
  
              widget.on_change('value', callback1, callback2, ..., callback_n)
  
          '''
          if attr not in self.properties():
              raise ValueError("attempted to add a callback on nonexistent %s.%s property" % (self.__class__.__name__, attr))
          super(Model, self).on_change(attr, *callbacksf 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
              *callbacks (callable) : callback functions to register
  
          Returns:
              None
  
          Example:
  
          .. code-block:: python
  
              widget.on_change('value', callback1, callback2, ..., callback_n)
  
          '''
          if attr not in self.properties():
              raise ValueError("attempted to add a callback on nonexistent %s.%s property" % (self.__class__.__name__, attr))
          super(Model, self).on_change(attr, *callbacks)
docs: Add a callback on this object to trigger when ``attr`` changes.
  
          Args:
              attr (str) : an attribute name on this object
              *callbacks (callable) : callback functions to register
  
          Returns:
              None
  
          Example:
  
          .. code-block:: python
  
              widget.on_change('value', callback1, callback2, ..., callback_n)