68 lines
1.2 KiB
PHP
68 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();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
?>
|