code: def on(self, events, callback, times=None):
          
          # Make sure our _on_off_events dict is present (if first invokation)
          if not hasattr(self, '_on_off_events'):
              self._on_off_events = {}
          if isinstance(events, (str, unicode)):
              events = [events]
          callback_obj = {
              'callback': callback,
              'times': times,
              'calls': 0
          }
          for event in events:
              if event not in self._on_off_events:
                  self._on_off_events.update({event: [callback_obj.copy()]})
              else:
                  self._on_off_events[event].append(callback_obj.copy())
docs: Registers the given *callback* with the given *events* (string or list
          of strings) that will get called whenever the given *event* is triggered
          (using :meth:`self.trigger`).
  
          If *times* is given the *callback* will only be fired that many times
          before it is automatically removed from :attr:`self._on_off_events`.