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`.

def on(self, events, callback, times=None):
        """
        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`.
        """
        # 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())