public static void AssertIsNotInvokedDuringNSubstituteQuery(IInvocation invocation,
                                                                Func <Type, GenerationRequest, object> instanceSource)
    {
        var interceptedInvocation = new InterceptedInvocation(invocation, instanceSource);

        if (interceptedInvocation.IsPropertyGetter())
        {
            return;
        }

        try
        {
            var assembly = AppDomain.CurrentDomain.GetAssemblies().SingleOrDefault(a =>
                                                                                   a.FullName.StartsWith("NSubstitute,") && a.CodeBase.EndsWith("NSubstitute.dll"));
            if (assembly != null)
            {
                if (assembly.SubstitutionContextClass().Current().ThreadContext().IsQuerying())
                {
                    throw new AnyInstanceUsedInsteadOfNSubstituteDuringAQueryException();
                }
            }
        }
        catch (AnyInstanceUsedInsteadOfNSubstituteDuringAQueryException)
        {
            throw;
        }
        catch (Exception e)
        {
            Console.WriteLine($"NSubstitute hack could not be processed because {e}");
        }
    }
    public void SetupReturnValueFor(
        IInvocation invocation,
        Func <Type, GenerationRequest, object> instanceSource,
        GenerationRequest request)
    {
        var interceptedInvocation = new InterceptedInvocation(invocation, instanceSource);

        if (interceptedInvocation.HasReturnValue())
        {
            interceptedInvocation.GenerateAndAddMethodReturnValueTo(_cache, request);
        }
        else if (interceptedInvocation.IsPropertySetter())
        {
            interceptedInvocation.GenerateAndAddPropertyGetterReturnValueTo(_cache);
        }
    }