rosavox/lib/alveolata/module/implementation-system.php
2025-05-23 07:33:29 +00:00

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();
}
}
}
?>