/// <summary>
        /// Post-initialization Architech Types Referenced
        /// </summary>
        /// <param name="includingSelf"></param>
        /// <returns></returns>
        public ArchList <ArchitectType> ReferencedTypes(bool includingSelf)
        {
            ArchList <ArchitectType> alist = new ArchList <ArchitectType>();

            if (referencedTypes == null)
            {
                DirectRefTypes.ForEach(a => alist.Add(DeclaringType.Architecture.Types.Find(A => A.Class == a)));
                referencedTypes = alist;
            }
            else
            {
                referencedTypes.ForEach(M => alist.Add(M));
            }

            if (!includingSelf)
            {
                alist.RemoveAll(A => A.FullName.Contains(DeclaringType.Name));
            }
            return(alist.Clean());
        }
        /// <summary>
        /// Assign direct reference information to original types and members
        /// </summary>
        private void DetermineReferences()
        {
            // This method is created separately to provide recursive function of NestedTypes

            List <Type> types = DeclaringType.Architecture.BaseTypes;

            switch (Member.MemberType)
            {
            case MemberTypes.Constructor:
                // parameter types, local types, method
                ConstructorInfo C = (ConstructorInfo)Member;

                C.GetParameters().ToList().ForEach(param =>
                                                   { if (types.Contains(param.ParameterType))
                                                     {
                                                         DirectRefTypes.Add(param.ParameterType);
                                                     }
                                                   });
                C.GetMethodBody().LocalVariables.ToList().ForEach(local =>
                                                                  { if (types.Contains(local.LocalType))
                                                                    {
                                                                        DirectRefTypes.Add(local.LocalType);
                                                                    }
                                                                  });

                InterpretBody();
                break;

            case MemberTypes.Method:
                // return type, parameter types, local types, method
                MethodInfo Mthd = (MethodInfo)Member;
                if (types.Contains(Mthd.ReturnType))
                {
                    DirectRefTypes.Add(Mthd.ReturnType);
                }

                Mthd.GetParameters().ToList().ForEach(param =>
                                                      { if (types.Contains(param.ParameterType))
                                                        {
                                                            DirectRefTypes.Add(param.ParameterType);
                                                        }
                                                      });
                Mthd.GetMethodBody().LocalVariables.ToList().ForEach(local =>
                                                                     { if (types.Contains(local.LocalType))
                                                                       {
                                                                           DirectRefTypes.Add(local.LocalType);
                                                                       }
                                                                     });

                InterpretBody();
                break;

            case MemberTypes.Property:     // type, get method, set method
                PropertyInfo P = (PropertyInfo)Member;
                if (types.Contains(P.PropertyType))
                {
                    DirectRefTypes.Add(P.PropertyType);
                }

                new MethodInfo[2] {
                    P.GetGetMethod(), P.GetSetMethod()
                }.ToList().FindAll(M => M != null).ForEach(M =>
                {
                    M.GetMethodBody().LocalVariables.ToList().ForEach(local =>
                                                                      { if (types.Contains(local.LocalType))
                                                                        {
                                                                            DirectRefTypes.Add(local.LocalType);
                                                                        }
                                                                      });
                });

                InterpretBody();
                break;

            case MemberTypes.Event:
                // add method, remove method, raise method, 'other' methods
                EventInfo E = (EventInfo)Member;

                List <MethodInfo> methods = new MethodInfo[3] {
                    E.GetAddMethod(), E.GetRemoveMethod(), E.GetRaiseMethod()
                }.ToList();
                methods.AddRange(E.GetOtherMethods());
                methods.FindAll(M => M != null).ForEach(M =>
                {
                    M.GetMethodBody().LocalVariables.ToList().ForEach(local =>
                                                                      { if (types.Contains(local.LocalType))
                                                                        {
                                                                            DirectRefTypes.Add(local.LocalType);
                                                                        }
                                                                      });
                });

                InterpretBody();
                break;

            case MemberTypes.Field:
                // type
                FieldInfo F = ((FieldInfo)Member);
                if (types.Contains(F.FieldType))
                {
                    DirectRefTypes.Add(F.FieldType);
                }
                break;

            default:     // Nested, TypeInfo, Custom, All
                break;
            }
        }