// Instruments a BeginEventHandler method [(object, sender, EventArgs, object) -> IAsyncResult].
        // This pattern is commonly used, such as by IHttpModule, PageAsyncTask, and others.
        // If AppVerifier is disabled, returns the original method unmodified.
        public static BeginEventHandler WrapBeginMethod(HttpApplication httpApplication, BeginEventHandler originalDelegate)
        {
            if (!IsAppVerifierEnabled)
            {
                return(originalDelegate);
            }

            return((sender, e, cb, extraData) => WrapBeginMethodImpl(
                       httpApplication: httpApplication,
                       beginMethod: (innerCallback, innerState) => originalDelegate(sender, e, innerCallback, innerState),
                       originalDelegate: originalDelegate,
                       errorHandler: HandleAppVerifierException,
                       callStackMask: CallStackCollectionBitMasks.AllStepMask)
                       (cb, extraData));
        }
        // Instruments a 3-parameter Begin* method [(T, AsyncCallback, object) -> IAsyncResult].
        // If AppVerifier is disabled, returns the original method unmodified.
        public static Func <T, AsyncCallback, object, IAsyncResult> WrapBeginMethod <T>(HttpApplication httpApplication, Func <T, AsyncCallback, object, IAsyncResult> originalDelegate)
        {
            if (!IsAppVerifierEnabled)
            {
                return(originalDelegate);
            }

            return((arg, callback, state) => WrapBeginMethodImpl(
                       httpApplication: httpApplication,
                       beginMethod: (innerCallback, innerState) => originalDelegate(arg, innerCallback, innerState),
                       originalDelegate: originalDelegate,
                       errorHandler: HandleAppVerifierException,
                       callStackMask: CallStackCollectionBitMasks.AllHandlerMask)
                       (callback, state));
        }