public static SubstituteForBuilder <T> InjectProperties <T>(this SubstituteForBuilder <T> builder)
     where T : class
 => builder.ConfigureSubstitute((t, ctx) =>
 {
     ctx.InjectUnsetProperties(t);
     AutoPropertyInjectorMockHandler.Instance.OnMockCreated(t, typeof(T), ctx, builder.Context);
 });
        private SubstituteForBuilder <TService> CreateSubstituteForBuilder <TService>(Func <TService> factory, bool isSubstituteFor)
            where TService : class
        {
            if (_substituteForRegistrations.TryGetValue(typeof(TService), out var result))
            {
                var previousBuilder = (SubstituteForBuilder <TService>)result;

                if (previousBuilder.IsSubstituteFor != isSubstituteFor)
                {
                    throw new InvalidOperationException("Cannot change a service registration between SubstituteFor and SubstituteForPartsOf");
                }

                return(previousBuilder);
            }

            var registration = _builder.Register(_ => factory())
                               .As <TService>()
                               .InstancePerLifetimeScope();
            var builder = new SubstituteForBuilder <TService>(this, registration, isSubstituteFor);

            _substituteForRegistrations.Add(typeof(TService), builder);

            if (_options.AutoInjectProperties)
            {
                builder.InjectProperties();
            }

            return(builder);
        }
        /// <summary>
        /// Configures the auto-generated instance of <typeparamref name="T"/> to not call the base method for any of the methods.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="builder"></param>
        /// <returns></returns>
        public static SubstituteForBuilder <T> DoNotCallBase <T>(this SubstituteForBuilder <T> builder)
            where T : class
        => builder.ConfigureSubstitute(t =>
        {
            var router = SubstitutionContext.Current.GetCallRouterFor(t);

            router.CallBaseByDefault = false;
        });