async def METHOD_NAME(self, resource, action, property=None, skip_uuids={}):
    if not property:
        key = f"{resource}/{action}"
    else:
        key = f"{resource}/{action}/{property}"
    if key not in self.queues:
        q = self.queues[key] = asyncio.Queue()
    else:
        q = self.queues[key]
    first_requeued = None
    while True:
        event = await q.METHOD_NAME()
        q.task_done()
        if not event:
            # exit signal received
            return None, action
        if first_requeued is not None and first_requeued is event:
            # if we reach here, we've cycled through the whole queue
            # and found nothing for us, so sleep and give the next
            # subscriber a chance
            q.put_nowait(event)
            await asyncio.sleep(random.uniform(0, 0.01))
            continue
        if event.expired:
            continue
        elif event.uuid in skip_uuids:
            q.put_nowait(event)
            if first_requeued is None:
                first_requeued = event
        else:
            return event, action