parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Дубль №2 - забыл закрыть тэг [code]

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]