*/ private array $calculators = []; /** * @var string[] */ private array $defaultCalculator = []; public function addCalculator(CalculatorInterface $calculator, bool $default) { $this->calculators[$calculator->getAlias()] = $calculator; if ($default) { $this->defaultCalculator[] = $calculator->getAlias(); } } /** * @param array $elements * * @return CalculatorResult[] */ public function calculateDefault(array $elements) { $results = []; foreach ($this->defaultCalculator as $alias) { $result = $this->getCalculator($alias)->calculate($elements); if (null !== $result) { $results[$alias] = $result; } } return $results; } public function getCalculator(string $alias): CalculatorInterface { if (false === array_key_exists($alias, $this->calculators)) { throw new OutOfBoundsException("The calculator with alias '{$alias}' does " . 'not exists. Possible values are ' . implode(', ', array_keys($this->calculators))); } return $this->calculators[$alias]; } }