67 lines
1.2 KiB
PHP
67 lines
1.2 KiB
PHP
<?php
|
|
|
|
namespace alveolata\module;
|
|
|
|
require_once(DIR_ALVEOLATA . '/algorithm/functions.php');
|
|
require_once(DIR_ALVEOLATA . '/module/interface.php');
|
|
|
|
|
|
class implementation_system implements interface_module
|
|
{
|
|
|
|
/**
|
|
* @var array {map<string,record<module:interface_module,dependencies:list<string>>>}
|
|
*/
|
|
private $members;
|
|
|
|
|
|
/**
|
|
* @var null|array {union<null,list<string>>}
|
|
*/
|
|
private $order;
|
|
|
|
|
|
/**
|
|
* @param array $members {map<string,record<module:interface_module,dependencies:list<string>>>}
|
|
*/
|
|
public function __construct(
|
|
array $members
|
|
)
|
|
{
|
|
$this->members = $members;
|
|
$dependencies = [];
|
|
foreach ($this->members as $name => $stuff) {
|
|
$dependencies[$name] = $stuff['dependencies'];
|
|
}
|
|
$this->order = \alveolata\algorithm\topsort($dependencies);
|
|
}
|
|
|
|
|
|
/**
|
|
* [implementation]
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function setup(
|
|
) : void
|
|
{
|
|
foreach ($this->order as $name) {
|
|
$this->members[$name]['module']->setup();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* [implementation]
|
|
* @author Christian Fraß <frass@greenscale.de>
|
|
*/
|
|
function teardown(
|
|
) : void
|
|
{
|
|
foreach (array_reverse($this->order) as $name) {
|
|
$this->members[$name]['module']->teardown();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
?>
|