protected virtual bool InnerExtend(ClassDefinition extension, bool raiseEvent, bool parent)
        {
            if (extension == null || extension == this) return false;

            string name = KeyName;

            int ext_index = InnerInheritanceList.GetKeyIndex(extension.Name);
            int my_index = (parent) ? InnerInheritanceList.GetKeyIndex( name ) : -1;

            // все алгоритмы должны работать для "my_index",
            // тогда можно будет менять порядок своих предков
            if (ext_index > 0 && my_index > 0 && my_index >= ext_index)
                // класс уже есть в списке наследования перед нами
                return false;

            InnerFullInheritanceList = null; // что бы пересчитать потом

            if (CopyExtensions) {
                // добавить список наследования "перед" указанным индексом
                // (если my_index < 0, то добавим в конец)

                //extension.PopulateInheritanceList( InnerInheritanceList, my_index);
                // { для варианта "хранить только список непосредственных родителей"
                if (parent && my_index >= 0)
                    InnerInheritanceList.InsertAt(my_index, extension.Name, extension);
                else
                    InnerInheritanceList[extension.Name] =  extension;
                // }

                if (ext_index < 0) {
                    UpdateSlotListAfterExtention(ListChangeType.Add, extension);

                } else {
                    // TODO: если extension переместили, то список определения слотов тоже
                    // должен перестроиться..
                    // и методов...
                }

            } else {
                if (parent && my_index >= 0)
                    InnerInheritanceList.InsertAt(my_index, extension.Name, extension);
                else
                    InnerInheritanceList[extension.Name] = extension;
                // XXX точно не нужно навещивать обработчики?
                // extension.AfterSlotListChanged += OnExtensionSlotListChanged;
            }

            if ( raiseEvent )
                OnExtension(ListChangeType.Add, extension);

            return true;
        }
 protected virtual void OnExtensionExtend(object sender, ExtensionListChangedEventArgs args)
 {
     // TODO: перестроить списки слотов и методов...
     InnerFullInheritanceList = null;
     UpdateSlotListAfterExtention(args.ChangeType, args.Extensions);
     OnExtension(ListChangeType.Update, args.Extensions);
 }
        public virtual FixedOrderDictionary PopulateInheritanceList(FixedOrderDictionary ext, int index)
        {
            if (ext == null)
                ext = new FixedOrderDictionary();

            string name = KeyName;

            // XXX так изголялись, что бы менять порядок прямо в списке, а теперь тупо список перестраиваем с 0...
            if (index >= 0)
                ext.InsertAt(index, name, this);

            //for (int i = 0; i < InnerInheritanceList.Count; i++) {
            foreach (string cname in InnerInheritanceList.Keys) {
                ClassDefinition cd = (ClassDefinition)InnerInheritanceList[cname];
                if (cd != this)
                    cd.PopulateInheritanceList(ext, (index < 0) ? index : ext.GetKeyIndex(name));
                else if (index < 0)
                    ext[name] = this;
            }

            return ext;
        }