internal void Instantiate(ContainerService.Builder builder)
        {
            LifestyleAttribute lifestyle;
            if (builder.Type.IsSimpleType())
                builder.SetError("can't create simple type");
            else if (builder.Type == typeof (IContainer))
                builder.AddInstance(this, false);
            else if (builder.Configuration.ImplementationAssigned)
                builder.AddInstance(builder.Configuration.Implementation, builder.Configuration.ContainerOwnsInstance);
            else if (builder.Configuration.Factory != null)
                builder.CreateInstanceBy(() => builder.Configuration.Factory(this), builder.Configuration.ContainerOwnsInstance);
            else if (builder.Configuration.FactoryWithTarget != null)
            {
                if (!builder.Context.AnalizeDependenciesOnly)
                {
                    var previousService = builder.Context.GetPreviousBuilder();
                    var target = previousService == null ? null : previousService.Type;
                    builder.CreateInstanceBy(() => builder.Configuration.FactoryWithTarget(this, target),
                        builder.Configuration.ContainerOwnsInstance);
                }
            }
            else if (builder.Type.IsValueType)
                builder.SetError("can't create value type");
            else if (builder.Type.IsGenericType && builder.Type.ContainsGenericParameters)
                builder.SetError("can't create open generic");
            else if (!builder.CreateNew && builder.Type.TryGetCustomAttribute(out lifestyle) &&
                     lifestyle.Lifestyle == Lifestyle.PerRequest)
            {
                const string messageFormat = "service [{0}] with PerRequest lifestyle can't be resolved, use Func<{0}> instead";
                builder.SetError(string.Format(messageFormat, builder.Type.FormatName()));
            }
            else if (builder.Type.IsAbstract)
                InstantiateInterface(builder);
            else
                InstantiateImplementation(builder);

            if (builder.Configuration.InstanceFilter != null)
            {
                var filteredOutCount = builder.FilterInstances(builder.Configuration.InstanceFilter);
                if (filteredOutCount > 0)
                    builder.SetComment("instance filter");
            }
        }