public void Handle(CompositeTypeDescriptor composite)
        {
            var lhsType = Namespace.Types.FindByName(composite.Name) as CompositeTypeDescriptor;

            if (lhsType == null)
            {
                lhsType = Namespace.CreateCompositeType(composite.Name);
            }

            var rhsFields  = composite.Fields.ToList();
            int fieldIndex = -1;

            foreach (var field in rhsFields)
            {
                ++fieldIndex;

                var lhsField = lhsType.Fields.FirstOrDefault(_ => _.Name == field.Name);
                if (lhsField == null)
                {//TODO optimise
                    int insertionPos = GetInsertPosition(lhsType.Fields.ToList(), rhsFields, fieldIndex);
                    lhsField = lhsType.AddField(field.Name, field.TypeName, field.IsCollection, insertionPos);
                }

                if (lhsField.IsCollection != field.IsCollection || lhsField.TypeName != field.TypeName)
                {
                    _logger.LogWarning("different field definitions lhs:[{lhs}], rhs:[{rhs}]", lhsField.ToXml(), field.ToXml());
                }

                field.AttachedData.Where(_ => !lhsField.AttachedData.Keys.Contains(_.Key)).ToList().ForEach(_ => lhsField.AttachedData.Add(_));
            }
        }