Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Sumo 08.10.2015 13:24 / 08.10.2015 13:31
http://www.parser.ru/forum/?id=81689@CLASS pfMixin ## Базовый класс миксина. ## Объект донор доступен через переменную this миксина. @static:mixin[aContainer;aOptions][obj] ## aContainer[$caller.self] — если передали миксиним в объект, иначе берем self из caller'а. ## aOptions — параметры, которые передаются инициалищатору миксина $result[] $obj[^reflection:create[$CLASS_NAME;__init__;^if(def $aContainer){$aContainer}{$caller.self};$aOptions]] @__init__[aThis;aOptions][locals] ## Инициализатор миксина. Используется вместо конструктора. ## aOptions.export[$.method1[] $.method2[]] $aOptions[^hash::create[$aOptions]] $self.this[$aThis] $self.mixinName[__${CLASS_NAME}__] $self.this.[$mixinName][$self] $lMethods[^if($aOptions.export){$aOptions.export}{^reflection:methods[$CLASS_NAME]}] $lForeach[^reflection:method[$lMethods;foreach]] ^lForeach[m;_]{ ^if(!def $aOptions.export && (^m.left(1) eq "_" || $m eq "mixin")){^continue[]} ^if(!($this.[$m] is junction)){$this.[$m][^reflection:method[$self;$m]]} } #-------------------------------------------------------------------------------------------------- @CLASS pfHashMixin ## Добавляет объекту интерфейс хеша @BASE pfMixin @__init__[aThis;aOptions] ## aOptions.includeJunctionFields.bool(false) — включать junction-поля. ^BASE:__init__[$aThis;$aOptions] $self._includeJunctionFields(^aOptions.includeJunctionFields.bool(false)) @contains[aName][locals] ## Проверяет есть ли у объекта поле с именем aName. $lFields[^reflection:fields[$this]] $result(^lFields.contains[$aName]) ^if($result && !$_includeJunctionFields && $lFields.[$aName] is junction){ $result(false) } @foreach[aKeyName;aValueName;aCode;aSeparator][locals] ## Обходит все поля объекта. $lFields[^reflection:fields[$this]] $lForeach[^reflection:method[$lFields;foreach]] $result[^lForeach[lKey;lValue]{^if(!$_includeJunctionFields && $lValue is junction){^continue[]}$caller.[$aKeyName][$lKey]$caller.[$aValueName][$lValue]$aCode}[$aSeparator]]Мне очень понравилось, что в миксинах еще и свое пространство имен существует, которое не смешивается с базовым объектом. Т.е. можно хорошо сокрытие данных делать, а доступ через функции.
@USE ../lib/common.p @main[][locals] ^test_hash_mixin[] Finish tests.^#0A @print_fields[aObj][locals] $f[^reflection:fields[$aObj]] ^f.foreach[k;v]{ $k - $v.CLASS_NAME ^if($v is string){— $v} } @test_hash_mixin[][locals] Hash mixin test: $o[^hash_mixin_class::create[]] # ^print_fields[$o] ^o.foreach[k;v]{ $k -> $v.CLASS_NAME } @CLASS hash_mixin_class @BASE pfClass @create[] ^BASE:create[] ^pfHashMixin:mixin[$self;$.includeJunctionFields(true)] $field[value]