public async Task <Response> HandleAsync(TRequest request)
        {
            using (var cts = new CancellationTokenSource())
            {
                var token = cts.Token;

                foreach (var requestHook in _requestConfig.GetRequestHooks())
                {
                    await requestHook.Run(request, token).Configure();

                    token.ThrowIfCancellationRequested();
                }

                return(await _decorateeFactory().HandleAsync(request));
            }
        }
        internal static async Task RunRequestHooks(this ICrudRequest request,
                                                   ICrudRequestConfig config,
                                                   CancellationToken ct)
        {
            var hooks = config.GetRequestHooks();

            foreach (var hook in hooks)
            {
                try
                {
                    await hook.Run(request, ct).Configure();

                    ct.ThrowIfCancellationRequested();
                }
                catch (Exception e) when(IsNonCancellationFailure(e))
                {
                    throw new CrudHookFailedException(GenericHookError("request"), e)
                          {
                              HookProperty = hook
                          };
                }
            }
        }