protected EmbeddedPart <TEmbedded> Embedded <TEmbedded>(Expression <Func <T, TEmbedded> > property)
        {
            var part = new EmbeddedPart <TEmbedded>(property.ToPropertyInfo());

            this.embeddedParts.Add(part);

            return(part);
        }
        /// <summary>
        /// TODO: Remimplement circular reference prevention
        /// </summary>
        /// <param name="doc"></param>
        /// <param name="part"></param>
        /// <param name="context"></param>
        private void BuildEmbedded(DocumentMapping doc, EmbeddedPart <T> part, BuildContext context)
        {
            var oldMaxLevel = this.maxLevel;
            var embedded    = part;
            // var property = part.Property.ToPropertyInfo();
            var elementType = part.GetType().GetGenericArguments()[0];

            this.level++;

            //var localPrefix = embedded.InternalPrefix == "." ? property.Name + "." : embedded.InternalPrefix;

            //if (this.maxLevel == int.MaxValue && context.Processed.Contains(elementType))
            //	throw new Exception("Circular reference");

            //if (this.level <= this.maxLevel)
            // {
            //    context.Processed.Add(elementType);

            var map = embedded.GetMapping();

            // map.Prefix = localPrefix;

            if (typeof(IEnumerable).IsAssignableFrom(elementType))
            {
                map.IsCollection = true;
            }

            doc.Embedded.Add(map);

            //var actualType = property.PropertyType;
            //context.Processed.Remove(actualType);
            // }

            //this.level--;
            // this.maxLevel = oldMaxLevel;
        }