예제 #1
0
        public ClassDefinition(SchemeNode parent, string name, bool copyExtensions, ClassDefinition[] extensions, params SlotDefinition[] slots)
            : base(parent)
        {
            if (parent == null)
                InnerIsSchemeEditable = false;

            CopyExtensions = copyExtensions;

            InnerName = name;
            InnerFullName = Version.ToString("D");

            if (extensions != null && extensions.Length > 0)
                foreach (ClassDefinition ext in extensions)
                    if (!InnerInheritanceList.Contains(ext.Name))
                        InnerExtend(ext, false, true);

            InnerInheritanceList[KeyName] = this;
                // Если в InheritanceList-е будут FullName, то потом сложно производить
                // диспач для бихейверов.
                // всущности, фул-нейм нужен, что бы сигнализировать о наличии "динамических" классов всписке
                // но не понятно, зачем это нужно!

            // XXX был Add, поменял на [] (Pilya)
            //KeyName,
            //	this);

            if (slots != null && slots.Length > 0)
                foreach (SlotDefinition slot in slots)
                    if (slot != null)
                        InnerAddSlot(slot, true, true);

            if (CopyExtensions)
                InnerBehavior = new BehaviorDispatcher(this);
            else
                ;// ?? надо думать!
        }
예제 #2
0
 public ClassDefinition(string name, bool copyExtensions, ClassDefinition[] extensions, params SlotDefinition[] slots)
     : this(null, name, copyExtensions, extensions, slots)
 {
 }
예제 #3
0
 public ClassDefinition(SchemeNode parent, string name, ClassDefinition[] extensions, params SlotDefinition[] slots)
     : this(parent, name, true, extensions, slots)
 {
 }
예제 #4
0
 public ClassDefinition(string name, ClassDefinition extension, params SlotDefinition[] slots)
     : this(name, new ClassDefinition[] { extension }, slots)
 {
 }
예제 #5
0
        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;
        }
예제 #6
0
 public virtual IDataContainer CreateDataContainer(ClassDefinition cls)
 {
     throw new Exception("The method or operation is not implemented.");
 }
예제 #7
0
 public virtual IObjectScope CreateScope(ClassDefinition cls)
 {
     throw new Exception("The method or operation is not implemented.");
 }
예제 #8
0
 //.................................................................
 public virtual IObject Create(ClassDefinition cls, params object[] args)
 {
     throw new Exception("The method or operation is not implemented.");
 }
예제 #9
0
        //.........................................................................
        public virtual bool Apply(ClassDefinition cls, params object[] args)
        {
            ExtenderDelegate body = Body;
            if (body == null) return false;

            return body(cls, args) != null;
        }
예제 #10
0
 public LObject(ClassDefinition definition)
     : base(definition)
 {
 }
예제 #11
0
        // TODO: сделать ThreadSafe!
        protected virtual string InnerSetClass(string name, ClassDefinition cd)
        {
            if (cd == null) return null;
            if (name == null) name = cd.Name;

            if (name == null) return null; // TODO: а зря!
            name = name.Trim().ToLower();
            if (name == "")	return null;

            ArrayList cl = InnerClasses[name] as ArrayList;
            if (cl == null)
                InnerClasses[name] = cl = new ArrayList();

            cl.Insert(0, cd);
            return name;
        }
예제 #12
0
 // TODO RegisterClass может сам делать добавленные классы read-only. Этого может не делать MetaInfoConfigurator
 public virtual ClassDefinition RegisterClass(ClassDefinition cls)
 {
     if (cls != null)
         InnerSetClass(cls.Name, cls);
     return cls;
 }