/// <summary>
        /// Consumes type members including fields, properties, methods and events.
        /// </summary>
        /// <param name="typeScope">The scope to be used as the containing scope.</param>
        /// <param name="type">The type whose members are to be consumed.</param>
        protected void ConsumeMembers(IPatternScope typeScope, ITypeInfo type)
        {
            BindingFlags bindingFlags = GetMemberBindingFlags(type);

            // TODO: We should probably process groups of members in sorted order working outwards
            //       from the base type, like an onion.
            foreach (IFieldInfo field in CodeElementSorter.SortMembersByDeclaringType(type.GetFields(bindingFlags)))
            {
                typeScope.Consume(field, false, DefaultFieldPattern);
            }

            foreach (IPropertyInfo property in CodeElementSorter.SortMembersByDeclaringType(type.GetProperties(bindingFlags)))
            {
                typeScope.Consume(property, false, DefaultPropertyPattern);
            }

            foreach (IMethodInfo method in CodeElementSorter.SortMembersByDeclaringType(type.GetMethods(bindingFlags)))
            {
                typeScope.Consume(method, false, DefaultMethodPattern);
            }

            foreach (IEventInfo @event in CodeElementSorter.SortMembersByDeclaringType(type.GetEvents(bindingFlags)))
            {
                typeScope.Consume(@event, false, DefaultEventPattern);
            }
        }
        public void SortMembersByDeclaringType()
        {
            List <IMethodInfo> members = new List <IMethodInfo>();

            members.Add(Reflector.Wrap(typeof(A).GetMethod("MemberA")));
            members.Add(Reflector.Wrap(typeof(C).GetMethod("MemberC")));
            members.Add(Reflector.Wrap(typeof(B).GetMethod("MemberB")));

            IList <IMethodInfo> sortedMembers = CodeElementSorter.SortMembersByDeclaringType(members);

            Assert.AreElementsEqual(new IMethodInfo[] { members[0], members[2], members[1] }, sortedMembers);
        }