private Boolean NewGenericTypeBinding(
            CollectionsFactory collectionsFactory,
            CompositeModel compositeModel,
            Type memberType,
            Type memberTypeDeclaringType,
            ListProxy <ListProxy <AbstractGenericTypeBinding> > currentBindings,
            IDictionary <Type, TypeBindingInformationState> privateComposites
            )
        {
            var result = !memberType.IsGenericType();

            if (!result)
            {
                result = !memberType.IsGenericParameter;
                if (result)
                {
                    // First, try to find from public types
                    var pt = FindImplementingTypeFrom(memberTypeDeclaringType, compositeModel.PublicTypes);
                    result = pt != null;
                    ListProxy <AbstractGenericTypeBinding> list;
                    if (result)
                    {
                        if (this.ProcessGenericTypeBindingFromPublicComposite(compositeModel, collectionsFactory, pt, memberType, out list))
                        {
                            currentBindings.Add(list);
                        }
                    }
                    else
                    {
                        result = !memberType.ContainsGenericParameters();
                        if (result)
                        {
                            result = this.ProcessGenericTypeBindingFromPublicComposite(compositeModel, collectionsFactory, Tuple.Create <Type, Type>(memberTypeDeclaringType, null), memberType, out list);
                            if (result)
                            {
                                currentBindings.Add(list);
                            }
                        }
                        else
                        {
                            // Otherwise, try to find from existing private composite bindings
                            pt     = FindImplementingTypeFrom(memberTypeDeclaringType, privateComposites.Keys);
                            result = pt != null;
                            if (result)
                            {
                                var eBindings = privateComposites[pt.Item2].Bindings.CQ;
                                var array     = eBindings.Select(b =>
                                {
                                    var success = this.ProcessGenericTypeBindingFromPrivateComposite(compositeModel, collectionsFactory, pt.Item1, memberType, b.CQ, out list);
                                    return(Tuple.Create(success, list));
                                }).ToArray();
                                if (array.Count(tuple => tuple.Item1) == eBindings.Count)
                                {
                                    currentBindings.AddRange(array.Select(tuple => tuple.Item2));
                                }
                            }
                        }
                    }
                }
            }
            return(result);
        }