FromDescriptor
Describes the source of types to register.
            
                using System;
using System.Collections.Generic;
namespace Castle.MicroKernel.Registration
{
    public abstract class FromDescriptor : IRegistration
    {
        private readonly Predicate<Type> additionalFilters;
        private readonly IList<BasedOnDescriptor> criterias;
        private bool allowMultipleMatches;
        protected FromDescriptor(Predicate<Type> additionalFilters)
        {
            this.additionalFilters = additionalFilters;
            allowMultipleMatches = false;
            criterias = new List<BasedOnDescriptor>();
        }
        protected abstract IEnumerable<Type> SelectedTypes(IKernel kernel);
        public FromDescriptor AllowMultipleMatches()
        {
            allowMultipleMatches = true;
            return this;
        }
        public BasedOnDescriptor BasedOn<T>()
        {
            return BasedOn(typeof(T));
        }
        public BasedOnDescriptor BasedOn(Type basedOn)
        {
            return BasedOn((IEnumerable<Type>)new Type[1] {
                basedOn
            });
        }
        public BasedOnDescriptor BasedOn(params Type[] basedOn)
        {
            return BasedOn((IEnumerable<Type>)basedOn);
        }
        public BasedOnDescriptor BasedOn(IEnumerable<Type> basedOn)
        {
            BasedOnDescriptor basedOnDescriptor = new BasedOnDescriptor(basedOn, this, additionalFilters);
            criterias.Add(basedOnDescriptor);
            return basedOnDescriptor;
        }
        public BasedOnDescriptor InNamespace(string namespace)
        {
            return Where(Component.IsInNamespace(namespace, false));
        }
        public BasedOnDescriptor InNamespace(string namespace, bool includeSubnamespaces)
        {
            return Where(Component.IsInNamespace(namespace, includeSubnamespaces));
        }
        public BasedOnDescriptor InSameNamespaceAs(Type type)
        {
            return Where(Component.IsInSameNamespaceAs(type));
        }
        public BasedOnDescriptor InSameNamespaceAs(Type type, bool includeSubnamespaces)
        {
            return Where(Component.IsInSameNamespaceAs(type, includeSubnamespaces));
        }
        public BasedOnDescriptor InSameNamespaceAs<T>()
        {
            return Where(Component.IsInSameNamespaceAs<T>());
        }
        public BasedOnDescriptor InSameNamespaceAs<T>(bool includeSubnamespaces) where T : class
        {
            return Where(Component.IsInSameNamespaceAs<T>(includeSubnamespaces));
        }
        public BasedOnDescriptor Pick()
        {
            return BasedOn<object>();
        }
        public BasedOnDescriptor Where(Predicate<Type> accepted)
        {
            BasedOnDescriptor basedOnDescriptor = new BasedOnDescriptor(new Type[1] {
                typeof(object)
            }, this, additionalFilters).If(accepted);
            criterias.Add(basedOnDescriptor);
            return basedOnDescriptor;
        }
        void IRegistration.Register(IKernelInternal kernel)
        {
            if (criterias.Count != 0) {
                foreach (Type item in SelectedTypes(kernel)) {
                    using (IEnumerator<BasedOnDescriptor> enumerator2 = criterias.GetEnumerator()) {
                        while (enumerator2.MoveNext() && (!enumerator2.Current.TryRegister(item, kernel) || allowMultipleMatches)) {
                        }
                    }
                }
            }
        }
    }
}