public static IHandler TrackPromise( this IHandler handler, IPolicy parentPolicy) { if (parentPolicy == null) { return(handler); } return(handler.Filter((callback, composer, proceed) => { var handled = proceed(); if (handled) { var cb = callback as ICallback; var promise = cb?.Result as Promise; if (promise != null) { var dependency = new PromisePolicy(promise).AutoRelease(); parentPolicy.AddDependency(dependency); promise.Finally(() => parentPolicy.RemoveDependency(dependency)); } } return handled; })); }