fml8 provides a boot loader to resolve version dependence dynamically. For example, the loader boot straps fml8 as follows:
fml (libexec/distribute) boots like this ... functions class ---------------------------------------- main::Bootstrap() libexec/loader | V main::Bootstrap2() FML::Process::Switch | V ProcessSwitch() FML::Process::Switch | | | switch to ($obj = FML::Process:Distribute) | V ProcessStart($obj,$args) FML::Process::Flow
fml8 loader boot straps like this in the case of distribution.
/usr/local/libexec/fml/distributre (is same as /usr/local/libexec/fml/loader in fact) reads /usr/local/etc/fml/main.cf and resolvers the version it should use from $fml_version variable. Let $fml_version current-20010501. The loader uses library perl modules under /usr/local/lib/fml/current-20010501/.
The loader resets @INC (perl include path). It loads FML::Process::Switch and checks $0 (program name in process table). The loader resolves from the name that the role is distribution. It loads FML::Process::Distribute and switches to the class.
The relation between program name and class (perl module) is defined at /usr/local/etc/fml/defaults/$fml_version/modules file.
FML::Process::Flow::ProcessStart() function drives these sequential steps. ProcessStart() takes FML::Process::Distribute object as an argument and drives the object.
Copyright (C) 1993-2018 Ken'ichi Fukamachi mail:< fukachan at fml.org >