public void Clone(CSharpObjectCollection coll, Settings settings)
        {
            coll.AddClass(Name);

            foreach (var c in ClassAssociations)
            {
                if (
                    (c.Visibility == CSharpVisibility.Public && settings.IncludePublicAssociations) ||
                    (c.Visibility == CSharpVisibility.Protected && settings.IncludeProtectedAssociations) ||
                    (c.Visibility == CSharpVisibility.Internal && settings.IncludeInternalAssociations) ||
                    (c.Visibility == CSharpVisibility.Private && settings.IncludePrivateAssociations)
                    )
                {
                    if (!coll.ClassExists(c.Class.Name))
                    {
                        c.Class.Clone(coll, settings);
                    }
                    coll.SetAssociation(Name, c.Class.Name, c.Visibility);
                }
            }

            if (settings.IncludeInheritance)
            {
                foreach (var i in Implements)
                {
                    if (!coll.InterfaceExists(i.Name))
                    {
                        coll.AddInterface(i.Name);
                    }
                    coll.SetExtends(Name, i.Name);
                }
                if (Derives != null)
                {
                    if (!coll.ClassExists(Derives.Name))
                    {
                        Derives.Clone(coll, settings);
                    }
                    coll.SetExtends(Name, Derives.Name);
                }
            }
        }
 private void DetermineExtensionAndComposition(ClassDeclarationSyntax c, CSharpObjectCollection coll)
 {
     if (c.BaseList != null)
     {
         foreach (var baseType in c.BaseList.Types)
         {
             coll.SetExtends(c.Identifier.ToString(), baseType.Type.ToString());
             log?.Invoke($"{c.Identifier.ToString()} extends {baseType.Type.ToString()}");
         }
     }
     foreach (var member in c.Members)
     {
         if (member is FieldDeclarationSyntax)
         {
             try
             {
                 var visibility = GetVisibility(member as FieldDeclarationSyntax);
                 var field      = member as FieldDeclarationSyntax;
                 var type       = field.Declaration.Type;
                 if (type is IdentifierNameSyntax)
                 {
                     coll.SetAssociation(
                         c.Identifier.ToString(),
                         (type as IdentifierNameSyntax).Identifier.Text,
                         visibility);
                     log?.Invoke(
                         $"{c.Identifier.ToString()} associates to {(type as IdentifierNameSyntax).Identifier.Text}");
                 }
                 else if (type is GenericNameSyntax)
                 {
                     coll.SetAssociation(
                         c.Identifier.ToString(),
                         (type as GenericNameSyntax).Identifier.Text,
                         visibility);
                     foreach (var arg in (type as GenericNameSyntax).TypeArgumentList.Arguments)
                     {
                         coll.SetAssociation(c.Identifier.ToString(), arg.ToString(), visibility);
                         log?.Invoke($"{c.Identifier.ToString()} associates to {arg.ToString()}");
                     }
                 }
             }
             catch (Exception e)
             {
                 log?.Invoke(e.ToString());
             }
         }
     }
 }