53 lines
1.3 KiB
PHP
53 lines
1.3 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file classes/core/MapsContainer.php
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2000-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class MapContainer
|
|
*
|
|
* @ingroup core
|
|
*
|
|
* @brief This service provider allows Map classes to be instantiated and
|
|
* applies any extensions to the map registered by plugins.
|
|
*/
|
|
|
|
namespace PKP\core;
|
|
|
|
use PKP\core\maps\Base;
|
|
|
|
class MapContainer
|
|
{
|
|
/** @var array Key/value map that stores extensions to maps registered by plugins */
|
|
protected array $extensions = [];
|
|
|
|
public function extend(string $map, callable $callback)
|
|
{
|
|
if (isset($this->extensions[$map])) {
|
|
$this->extensions[$map][] = $callback;
|
|
}
|
|
$this->extensions[$map] = [$callback];
|
|
}
|
|
|
|
public function getMap(string $class, array $dependencies = []): Base
|
|
{
|
|
return app($class, $dependencies);
|
|
}
|
|
|
|
public function withExtensions(string $class, array $dependencies = []): Base
|
|
{
|
|
$map = $this->getMap($class, $dependencies);
|
|
foreach ($this->extensions as $name => $extensions) {
|
|
if (is_a($map, $name)) {
|
|
foreach ($extensions as $extension) {
|
|
$map->extend($extension);
|
|
}
|
|
}
|
|
}
|
|
return $map;
|
|
}
|
|
}
|