private static ModelDescriptionGenerator InitializeModelDescriptionGenerator(HttpConfiguration config)
		{
			ModelDescriptionGenerator modelGenerator = new ModelDescriptionGenerator(config);
			Collection<ApiDescription> apis = config.Services.GetApiExplorer().ApiDescriptions;
			foreach (ApiDescription api in apis)
			{
				ApiParameterDescription parameterDescription;
				Type parameterType;
				if (TryGetResourceParameter(api, config, out parameterDescription, out parameterType))
				{
					modelGenerator.GetOrCreateModelDescription(parameterType);
				}
			}
			return modelGenerator;
		}
		private static void GenerateRequestModelDescription(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator, HelpPageSampleGenerator sampleGenerator)
		{
			ApiDescription apiDescription = apiModel.ApiDescription;
			foreach (ApiParameterDescription apiParameter in apiDescription.ParameterDescriptions)
			{
				if (apiParameter.Source == ApiParameterSource.FromBody)
				{
					Type parameterType = apiParameter.ParameterDescriptor.ParameterType;
					apiModel.RequestModelDescription = modelGenerator.GetOrCreateModelDescription(parameterType);
					apiModel.RequestDocumentation = apiParameter.Documentation;
				}
				else if (apiParameter.ParameterDescriptor != null &&
					apiParameter.ParameterDescriptor.ParameterType == typeof(HttpRequestMessage))
				{
					Type parameterType = sampleGenerator.ResolveHttpRequestMessageType(apiDescription);

					if (parameterType != null)
					{
						apiModel.RequestModelDescription = modelGenerator.GetOrCreateModelDescription(parameterType);
					}
				}
			}
		}
		private static void GenerateResourceDescription(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator)
		{
			ResponseDescription response = apiModel.ApiDescription.ResponseDescription;
			Type responseType = response.ResponseType ?? response.DeclaredType;
			if (responseType != null && responseType != typeof(void))
			{
				apiModel.ResourceDescription = modelGenerator.GetOrCreateModelDescription(responseType);
			}
		}
		private static void GenerateUriParameters(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator)
		{
			ApiDescription apiDescription = apiModel.ApiDescription;
			foreach (ApiParameterDescription apiParameter in apiDescription.ParameterDescriptions)
			{
				if (apiParameter.Source == ApiParameterSource.FromUri)
				{
					HttpParameterDescriptor parameterDescriptor = apiParameter.ParameterDescriptor;
					Type parameterType = null;
					ModelDescription typeDescription = null;
					ComplexTypeModelDescription complexTypeDescription = null;
					if (parameterDescriptor != null)
					{
						parameterType = parameterDescriptor.ParameterType;
						typeDescription = modelGenerator.GetOrCreateModelDescription(parameterType);
						complexTypeDescription = typeDescription as ComplexTypeModelDescription;
					}

					// Example:
					// [TypeConverter(typeof(PointConverter))]
					// public class Point
					// {
					//     public Point(int x, int y)
					//     {
					//         X = x;
					//         Y = y;
					//     }
					//     public int X { get; set; }
					//     public int Y { get; set; }
					// }
					// Class Point is bindable with a TypeConverter, so Point will be added to UriParameters collection.
					// 
					// public class Point
					// {
					//     public int X { get; set; }
					//     public int Y { get; set; }
					// }
					// Regular complex class Point will have properties X and Y added to UriParameters collection.
					if (complexTypeDescription != null
						&& !IsBindableWithTypeConverter(parameterType))
					{
						foreach (ParameterDescription uriParameter in complexTypeDescription.Properties)
						{
							apiModel.UriParameters.Add(uriParameter);
						}
					}
					else if (parameterDescriptor != null)
					{
						ParameterDescription uriParameter =
							AddParameterDescription(apiModel, apiParameter, typeDescription);

						if (!parameterDescriptor.IsOptional)
						{
							uriParameter.Annotations.Add(new ParameterAnnotation() { Documentation = "Required" });
						}

						object defaultValue = parameterDescriptor.DefaultValue;
						if (defaultValue != null)
						{
							uriParameter.Annotations.Add(new ParameterAnnotation() { Documentation = "Default value is " + Convert.ToString(defaultValue, CultureInfo.InvariantCulture) });
						}
					}
					else
					{
						Debug.Assert(parameterDescriptor == null);

						// If parameterDescriptor is null, this is an undeclared route parameter which only occurs
						// when source is FromUri. Ignored in request model and among resource parameters but listed
						// as a simple string here.
						ModelDescription modelDescription = modelGenerator.GetOrCreateModelDescription(typeof(string));
						AddParameterDescription(apiModel, apiParameter, modelDescription);
					}
				}
			}
		}