From @anlu, a good idea: Querying/Polling is a separate concern from checking/callbacks. Provide a process, unrelated to the existence of a callback or check, that checks for and caches decide updates, and simple, synchronous public API that returns the cached (and only the cached) objects directly when called. Cuts the phlegm (and much/most of the work of this class) considerably, is much easier to reason about, and is just generally better. Wanna bounce it off Neil before we pull the trigger but seems like the right thing to do.