Passed
Push — add-pre-plugins ( a890af )
by Chema
03:45
created

Gacela::runPrePlugins()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 7
nc 3
nop 1
dl 0
loc 14
ccs 8
cts 8
cp 1
crap 3
rs 10
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Gacela\Framework;
6
7
use Closure;
8
use Gacela\Framework\Bootstrap\GacelaConfig;
9
use Gacela\Framework\Bootstrap\SetupGacela;
10
use Gacela\Framework\Bootstrap\SetupGacelaInterface;
11
use Gacela\Framework\ClassResolver\AbstractClassResolver;
12
use Gacela\Framework\ClassResolver\Cache\GacelaFileCache;
13
use Gacela\Framework\ClassResolver\Cache\InMemoryCache;
14
use Gacela\Framework\ClassResolver\ClassResolverCache;
15
use Gacela\Framework\ClassResolver\GlobalInstance\AnonymousGlobal;
16
use Gacela\Framework\Config\Config;
17
use Gacela\Framework\Config\ConfigFactory;
18
use Gacela\Framework\Container\Container;
19
use Gacela\Framework\DocBlockResolver\DocBlockResolverCache;
20
use Gacela\Framework\Plugin\PluginInterface;
21
22
final class Gacela
23
{
24
    /**
25
     * Define the entry point of Gacela.
26
     *
27
     * @param null|Closure(GacelaConfig):void $configFn
28
     */
29 83
    public static function bootstrap(string $appRootDir, Closure $configFn = null): void
30
    {
31 83
        $setup = self::processConfigFnIntoSetup($appRootDir, $configFn);
32
33 83
        if ($setup->shouldResetInMemoryCache()) {
34 45
            AbstractFacade::resetCache();
35 45
            AnonymousGlobal::resetCache();
36 45
            AbstractFactory::resetCache();
37 45
            GacelaFileCache::resetCache();
38 45
            DocBlockResolverCache::resetCache();
39 45
            ClassResolverCache::resetCache();
40 45
            InMemoryCache::resetCache();
41 45
            AbstractClassResolver::resetCache();
42 45
            ConfigFactory::resetCache();
43 45
            Config::resetInstance();
44
        }
45
46 83
        $config = Config::createWithSetup($setup);
47 83
        $config->setAppRootDir($appRootDir)
48 83
            ->init();
49
50 83
        self::runPrePlugins($config);
51
    }
52
53
    /**
54
     * @param null|Closure(GacelaConfig):void $configFn
55
     */
56 83
    private static function processConfigFnIntoSetup(string $appRootDir, Closure $configFn = null): SetupGacelaInterface
57
    {
58 83
        if ($configFn !== null) {
59 57
            return SetupGacela::fromCallable($configFn);
60
        }
61
62 26
        $gacelaFilePath = $appRootDir . '/gacela.php';
63
64 26
        if (is_file($gacelaFilePath)) {
65
            return SetupGacela::fromFile($gacelaFilePath);
66
        }
67
68 26
        return new SetupGacela();
69
    }
70
71 83
    private static function runPrePlugins(Config $config): void
72
    {
73 83
        $prePlugins = $config->getSetupGacela()->getPrePlugins();
74
75 83
        if ($prePlugins === []) {
76 82
            return;
77
        }
78
79 1
        $container = Container::withConfig($config);
80
81 1
        foreach ($prePlugins as $pluginName) {
82
            /** @var PluginInterface $plugin */
83 1
            $plugin = $container->get($pluginName);
84 1
            $plugin->run();
85
        }
86
    }
87
}
88