private Maybe<string> GetPropertyDescription(AtomSymbol property)
 {
     return property.Annotations
         .TryGetValue("Description")
         .Select(x => x.SingleOrDefault())
         .SelectMaybe(x => x.Pairs.TrySingle(y => y.Key == "Summary"))
         .Select(x => x.Value.Value);
 }
 public virtual void VisitAtom(AtomSymbol atom)
 {
 }
        protected virtual void WritePropertyImplmementation(AtomSymbol property, MoleculeSymbol parent)
        {
            string privateType = GetPrivateTypeString(property, parent);
            string publicType = GetPublicTypeString(property, parent);
            string fieldName = Inflector.Camelize(property.Name);
            bool isMany = property.Cardinality.CanBeMoreThanOne();
            Maybe<string> description = GetPropertyDescription(property);

            WriteLine();
            WriteLine("private {0} _{1};", privateType, fieldName);
            if (description.HasValue)
            {
                WriteLine("/// <summary>");
                WriteLine("/// " + description.Value);
                WriteLine("/// </summary>");
            }
            WriteLine("public {0} {1} {{ get {{ return _{2}{3}; }} private set {{ _{2} = value{4}; }} }}", publicType, property.Name, fieldName, isMany ? ".AsEnumerable()" : "", isMany ? ".ToArray()" : "");
        }