private bool ProcessCollection(IFacetHolder holder) {
     var typeOfFacet = holder.GetFacet<ITypeOfFacet>();
     Type collectionElementType;
     if (typeOfFacet != null) {
         collectionElementType = typeOfFacet.Value;
     }
     else {
         collectionElementType = typeof (object);
         holder.AddFacet(new TypeOfFacetDefaultToObject(holder, Reflector));
     }
     holder.AddFacet(new DotNetCollectionFacet(holder, collectionElementType));
     return true;
 }
 public override bool Process(PropertyInfo property, IMethodRemover methodRemover, IFacetHolder holder) {
     if (CollectionUtils.IsCollectionButNotArray(property.PropertyType)) {
         holder.AddFacet(new CollectionResetFacet(property, holder));
         return true;
     }
     return base.Process(property, methodRemover, holder);
 }
        public virtual void Reparent(IFacetHolder newFacetHolder) {
            IFacetHolder oldFacetHolder = FacetHolder;

            oldFacetHolder.RemoveFacet(this);

            newFacetHolder.AddFacet(this);
            if (FacetHolder != newFacetHolder) {
                FacetHolder = newFacetHolder;
            }
        }
 private void DecoratedFacet(Type facetType, IFacetHolder holder) {
     if (facetDecorators.ContainsKey(facetType)) {
         foreach (IFacetDecorator decorator in facetDecorators[facetType]) {
             IFacet previousFacet = holder.GetFacet(facetType);
             IFacet decoratedFacet = decorator.Decorate(previousFacet, holder);
             if (decoratedFacet != null && decoratedFacet != previousFacet) {
                 holder.AddFacet(decoratedFacet);
             }
         }
     }
 }
        private bool ProcessGenericEnumerable(Type type, IFacetHolder holder) {
            var typeOfFacet = holder.GetFacet<ITypeOfFacet>();
            bool isCollection = CollectionUtils.IsGenericCollection(type); // as opposed to IEnumerable 
            bool isQueryable = CollectionUtils.IsGenericQueryable(type);
            bool isSet = CollectionUtils.IsSet(type);
            Type collectionElementType;
            if (typeOfFacet != null) {
                collectionElementType = typeOfFacet.Value;
            }
            else {
                collectionElementType = CollectionUtils.ElementType(type);
                holder.AddFacet(new TypeOfFacetInferredFromGenerics(collectionElementType, holder, Reflector));
            }

            Type facetType = isQueryable ? typeof (DotNetGenericIQueryableFacet<>) : (isCollection ? typeof (DotNetGenericCollectionFacet<>) : typeof (DotNetGenericIEnumerableFacet<>));

            Type genericFacet = facetType.GetGenericTypeDefinition();
            Type genericCollectionFacetType = genericFacet.MakeGenericType(CollectionUtils.ElementType(type));
            var facet = (IFacet) Activator.CreateInstance(genericCollectionFacetType, holder, collectionElementType, isSet);
            holder.AddFacet(facet);

            return true;
        }
 private bool ProcessArray(Type type, IFacetHolder holder) {
     holder.AddFacet(new DotNetArrayFacet(holder, type.GetElementType()));
     holder.AddFacet(new TypeOfFacetInferredFromArray(type.GetElementType(), holder, Reflector));
     return true;
 }