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

@inlineCallbacks
def _callback(self):

    self._to_add = []
    self._to_remove = []
    self._is_ticking = True
    for (store_key, (args, kwargs)) in self.subscriptions.iteritems():
        callback = (yield kwargs.pop('_callback', 'at_tick'))
        obj = (yield kwargs.pop('_obj', None))
        try:
            if callable(callback):
                (yield callback(*args, **kwargs))
                continue
            if ((not obj) or (not obj.pk)):
                self._to_remove.append(store_key)
                continue
            else:
                (yield _GA(obj, callback)(*args, **kwargs))
        except ObjectDoesNotExist:
            log_trace('Removing    ticker.')
            self._to_remove.append(store_key)
        except Exception:
            log_trace()
        finally:
            kwargs['_callback'] = callback
            kwargs['_obj'] = obj
    self._is_ticking = False
    for store_key in self._to_remove:
        self.remove(store_key)
    for (store_key, (args, kwargs)) in self._to_add:
        self.add(store_key, *args, **kwargs)
    self._to_remove = []
    self._to_add = []
