parser

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

 

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

родился метод ^my_use[path/to/modul.p]

mashi 09.02.2006 16:39

Может добавить его в общий lib.p
###############################################################
# компилирует модуль в контексте своего вызова
@my_use[modul_path][pname;process_body]
^if(!def $MAIN:processes){$MAIN:processes[^hash::create[]]}
^if(^modul_path.pos[/]){
#	если путь модуля начинается НЕ со слеша, то прибавляем к нему путь каталога классов
	$modul_path[${MAIN:CLASS_PATH}/$modul_path]
}
$pname[^math:md5[$modul_path]]
^if(!$MAIN:processes.$pname){
	^try{
		$process_body[^file::load[text;$modul_path]]
		$process_body[^taint[as-is][^trim[$process_body.text]]]
		^if(^process_body.pos[@main^[^]] >= 0){
#			если в нем есть буковки '@main[]' -- меняем их
			$process_body[^process_body.match[\@main\^[\^]][g]{@${pname}^[^]}]
		}{
#			а если их нету, и в файле что-то есть -- приделываем их в самое начало
			^if(def $process_body){
				$process_body[@${pname}^[^] ^#0A$process_body]
			}
		}
	}{
#		какой-то облом, ну и фиг с ним. бум считать, что кода нету
		$exception.handled(1)
		$process_body[]
	}
	^process[$caller.self]{$process_body}
#	запоминаем, что мы его уже откомпилили
	$MAIN:processes.$pname(1)
}
### end of @my_process[]
Пример использования
@CLASS
my_class

@create[params]
# ...
^if(^params.for_admin.int(0)){
#	если создают объект для администрирования, то в контексте текущего класса 
#	компелируем методы из модуля my_class_admin.p
	^my_use[my_class/my_class_admin.p]

#	Причем, повторное подключение не приведет к повторной компиляции
	^my_use[my_class/my_class_admin.p]
}
# ...
########### my_class_admin.p ###########
@method_1[]
# ...

@method_2[]
# ...

@method_N[]
# ...