Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Andrey 08.11.2014 19:57
Абстрактный пример:@CLASS myclass @OPTIONS # гипотетический режим, при котором например всё, что через $self.var # открытая переменная/поле, остальные видны всем методам объекта, # но неснаружи через обращение к объекту. # Если при этом нужны строго локальные в рамках метода, # то просто добавим отдельно у такого метода @method[][locals] class_locals hidden_methods @create[] $workdir[system] $sysfile[^file::load[sysfile.dat]] $self.user[root] @GET_sysmode[] ^if($workdir eq 'system' && def $sysfile){ $result[admin] }{ $result[normal] } @change_mode[mode] ^switch[mode]{ ^case[admin]{$workdir[system] ^_sysquirk[system] } ^case[normal{$workdir[home/$self.user] ^_sysquirk[normal] } } # фишка №2 - гипотетически скрытый метод, к # доступный только методам внутри класса, но не обращением из внешнего контекста @_sysquirk[mode] ^if($mode eq 'system'){ ^do_something_stricted[$vars] }{ ^do_else_stricted[$vars2] } #--------- MAIN ------------- @main[] $myobj[^myclass::create[]] # далее, такое обращение в нашей хотелке либо ничего не вернет, # либо ошибку если $STRICT-VARS(true), # т.к. она изолирована режимом class_locals $myobj.workdir # таким образом, напрямую записать и что-то испортить/сломать, не зная архитектуру класса - не выйдет $myobj.workdir[bootdir] # однако вы можете попросить у безопасного метода $myobj.changemode[admin] # или можете прочитать безопасное свойство $myobj.usermode # такое обращение к полю, вернёт - root, т.к. она явна "расшарена" инициализацией $self.user $myobj.user # этот метод нельзя вызвать напрямую, т.к. он умышленно изолирован через hidden_methods ^myobj._sysquirk[myvars]