public Stat AddStat(APIMember Member, string Name)
		{
			for(APIPage Page = Member; Page != null; Page = Page.Parent)
			{
				APIModule Module = Page as APIModule;
				if(Module != null)
				{
					// Get the stats for this module
					ModuleStats ModuleStatsInst;
					if(!Modules.TryGetValue(Module.Name, out ModuleStatsInst))
					{
						ModuleStatsInst = new ModuleStats();
						Modules.Add(Module.Name, ModuleStatsInst);
					}

					// Find the name of this stat
					Stat StatInst;
					if (!ModuleStatsInst.Stats.TryGetValue(Name, out StatInst))
					{
						StatInst = new Stat();
						ModuleStatsInst.Stats.Add(Name, StatInst);
					}

					// Update the current 
					return StatInst;
				}
			}
			return null;
		}
		public Stats(IEnumerable<APIMember> InMembers)
		{
			List<APIMember> Members = new List<APIMember>(InMembers);

			// Generate the page counts
			foreach(APIPage Page in Members)
			{
				Type PageType = Page.GetType();
				int PageCount = PageCounts.ContainsKey(PageType)? PageCounts[PageType] : 0;
				PageCounts.Remove(PageType);
				PageCounts.Add(PageType, PageCount + 1);
			}

			// Check all the records
			foreach(APIRecord Record in Members.OfType<APIRecord>())
			{
				AddStat(Record, "Class descriptions", Record.BriefDescription, Record.FullDescription);
			}

			// Check all the functions
			foreach(APIFunction Function in Members.OfType<APIFunction>())
			{
				AddStat(Function, "Function descriptions", Function.BriefDescription, Function.FullDescription);
			}

			// Check all the constants
			foreach (APIConstant Constant in Members.OfType<APIConstant>())
			{
				AddStat(Constant, "Constant descriptions", Constant.BriefDescription, Constant.FullDescription);
			}

			// Check all the enums
			foreach(APIEnum Enum in Members.OfType<APIEnum>())
			{
				AddStat(Enum, "Enum descriptions", Enum.BriefDescription, Enum.FullDescription);
				foreach (APIEnumValue EnumValue in Enum.Values)
				{
					AddStat(Enum, "Enum value descriptions", EnumValue.BriefDescription, EnumValue.FullDescription);
				}
			}

			// Check all the typedefs
			foreach (APITypeDef TypeDef in Members.OfType<APITypeDef>())
			{
				AddStat(TypeDef, "Typedef descriptions", TypeDef.BriefDescription, TypeDef.FullDescription);
			}

			// Check all the variables
			foreach (APIVariable Variable in Members.OfType<APIVariable>())
			{
				AddStat(Variable, "Variable descriptions", Variable.BriefDescription, Variable.FullDescription);
			}

			// Create the totals
			foreach(KeyValuePair<string, ModuleStats> ModulePair in Modules)
			{
				foreach(KeyValuePair<string, Stat> StatPair in ModulePair.Value.Stats)
				{
					Stat TotalStat;
					if (!Totals.TryGetValue(StatPair.Key, out TotalStat))
					{
						TotalStat = new Stat();
						Totals.Add(StatPair.Key, TotalStat);
					}
					TotalStat.NumDocumented += StatPair.Value.NumDocumented;
					TotalStat.NumUndocumented += StatPair.Value.NumUndocumented;
				}
			}
		}