/// <summary>
 /// Initializes a new instance of the <see cref="SwaggerModelDataBuilder{T}"/> class.
 /// </summary>
 public SwaggerModelDataBuilder()
 {
     Data = new SwaggerModelData(typeof(T));
 }
        public static IEnumerable <Model> ToModel(this SwaggerModelData model, IEnumerable <SwaggerModelData> knownModels = null)
        {
            var classProperties = model.Properties.Where(x => !Primitive.IsPrimitive(x.Type) && !x.Type.IsEnum && !x.Type.IsGenericType);

            var modelsData = knownModels ?? Enumerable.Empty <SwaggerModelData>();

            foreach (var swaggerModelPropertyData in classProperties)
            {
                var properties = GetPropertiesFromType(swaggerModelPropertyData.Type);

                var modelDataForClassProperty =
                    modelsData.FirstOrDefault(x => x.ModelType == swaggerModelPropertyData.Type);

                var id = modelDataForClassProperty == null
                    ? swaggerModelPropertyData.Type.Name
                    : SwaggerConfig.ModelIdConvention(modelDataForClassProperty.ModelType);

                var description = modelDataForClassProperty == null
                    ? swaggerModelPropertyData.Description
                    : modelDataForClassProperty.Description;

                var required = modelDataForClassProperty == null
                    ? properties.Where(p => p.Required || p.Type.IsImplicitlyRequired())
                               .Select(p => p.Name)
                               .OrderBy(name => name)
                               .ToList()
                    : modelDataForClassProperty.Properties
                               .Where(p => p.Required || p.Type.IsImplicitlyRequired())
                               .Select(p => p.Name)
                               .OrderBy(name => name)
                               .ToList();

                var modelproperties = modelDataForClassProperty == null
                    ? properties
                                      .OrderBy(x => x.Name)
                                      .ToDictionary(p => p.Name, ToModelProperty)
                    : modelDataForClassProperty.Properties
                                      .OrderBy(x => x.Name)
                                      .ToDictionary(p => p.Name, ToModelProperty);

                yield return(new Model
                {
                    Id = id,
                    Description = description,
                    Required = required,
                    Properties = modelproperties
                });
            }

            var topLevelModel = new Model
            {
                Id          = SwaggerConfig.ModelIdConvention(model.ModelType),
                Description = model.Description,
                Required    = model.Properties
                              .Where(p => p.Required || p.Type.IsImplicitlyRequired())
                              .Select(p => p.Name)
                              //.OrderBy(name => name)
                              .ToList(),
                Properties = model.Properties
                             //.OrderBy(p => p.Name)
                             .ToDictionary(p => p.Name, ToModelProperty)

                             // TODO: SubTypes and Discriminator
            };

            yield return(topLevelModel);
        }