@inlineCallbacks
    def _callback(self):
        """
        This will be called repeatedly every `self.interval` seconds.
        `self.subscriptions` contain tuples of (obj, args, kwargs) for
        each subscribing object.

        If overloading, this callback is expected to handle all
        subscriptions when it is triggered. It should not return
        anything and should not traceback on poorly designed hooks.
        The callback should ideally work under @inlineCallbacks so it
        can yield appropriately.

        The _hook_key, which is passed down through the handler via
        kwargs is used here to identify which hook method to call.

        """
        for store_key, (obj, args, kwargs) in self.subscriptions.items():
            hook_key = yield kwargs.pop("_hook_key", "at_tick")
            if not obj or not obj.pk:
                # object was deleted between calls
                self.remove(store_key)
                continue
            try:
                yield _GA(obj, hook_key)(*args, **kwargs)
            except __HOLE__:
                log_trace()
                self.remove(store_key)
            except Exception:
                log_trace()
            finally:
                # make sure to re-store
                kwargs["_hook_key"] = hook_key
dataset/ETHPy150Open evennia/evennia/evennia/scripts/tickerhandler.py/Ticker._callback