Item ItemBuilder(Type template_type, object data_source)
        {
            var data = new List <Data>(DataBuilder.GetDatasFor(template_type, data_source));
            var embedded_type_infos = TemplateType.get_public_writable_instance_properties().Where(x => x.PropertyType.Namespace == "System.Collections.Generic");
            var embedded_collection = new List <EmbeddedCollection>();

            foreach (var embedded_type_info in embedded_type_infos)
            {
                var property_name  = embedded_type_info.Name;
                var property_value = data_source.try_get_property_value(property_name);
                var embedded_items = new List <Item>();

                foreach (var element in (IEnumerable)property_value)
                {
                    var embedded_item = new Item();
                    embedded_item.data  = DataBuilder.GetDatasFor(element.GetType(), element);
                    embedded_item.links = CreateLinks(element);
                    embedded_items.Add(embedded_item);
                }

                embedded_collection.Add(new EmbeddedCollection {
                    name = property_name, items = embedded_items
                });
            }

            var item = new Item {
                data     = data,
                links    = new List <Link>(),
                embedded = embedded_collection
            };

            return(item);
        }