public async static Task <OperationResult> ErrorLogIfOperationFaultedAsync(this IExceptionLogger logger, Func <Type> declaringTypeCallback, string callingMethodName, Func <Task <IEnumerable <Tuple <string, object> > > > infoToAttach, Func <Task <OperationResult> > method)
        {
            OperationResult result = await method();

            if (result.HadErrors)
            {
                var info = new List <Tuple <string, object> >();

                if (infoToAttach != null)
                {
                    info.AddRange(await infoToAttach());
                }

                Type declaringType = declaringTypeCallback();
                if (declaringType != null)
                {
                    info.AddRange(new[] {
                        Tuple.Create <string, object>("Calling.Class", declaringType.AssemblyQualifiedName),
                        Tuple.Create <string, object>("Calling.Method", callingMethodName),
                    });
                }

                if (info.Any())
                {
                    ExceptionExtensions.AttachInfo(result.Exceptions, info);
                }

                await logger.LogExceptionsAsync(result.Exceptions);
            }
            return(result);
        }