Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
13 / 13
CRAP
100.00% covered (success)
100.00%
27 / 27
Smalldb
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
13 / 13
19
100.00% covered (success)
100.00%
27 / 27
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 registerGeneratedClassAutoloader
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
3 / 3
 registerMachineType
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
10 / 10
 getMachineProvider
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
3 / 3
 getReferenceClass
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 getDefinition
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 getTransitionsDecorator
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 getRepository
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 ref
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 nullRef
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 getMachineTypes
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 setDebugLogger
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
2 / 2
 getDebugLogger
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
1 / 1
<?php
/*
 * Copyright (c) 2017-2019, Josef Kufner  <josef@kufner.cz>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
namespace Smalldb\StateMachine;
use Psr\EventDispatcher\EventDispatcherInterface;
use Smalldb\StateMachine\ClassGenerator\GeneratedClassAutoloader;
use Smalldb\StateMachine\Definition\StateMachineDefinition;
use Smalldb\StateMachine\Provider\SmalldbProviderInterface;
use Smalldb\StateMachine\Transition\TransitionDecorator;
/**
 * The libSmalldb entry point.
 *
 * Smalldb class manages machine providers and uses them to provide
 * a simple lazy way to obtain repositories and references.
 */
class Smalldb
{
    /**
     * Map of registered machine types and their providers.
     *
     * @var SmalldbProviderInterface[]
     */
    private array $machineProviders = [];
    /**
     * List of registered machine names without aliases.
     *
     * @var string[]
     */
    private array $machineTypes = [];
    /**
     * Debug logger that is passed to other Smalldb components.
     */
    private ?DebugLoggerInterface $debugLogger = null;
    /**
     * Smalldb constructor.
     */
    public function __construct()
    {
    }
    /**
     * Helper method to register autoloader for generated classes when setting up a DI container.
     */
    public function registerGeneratedClassAutoloader(string $namespace, string $directory, bool $prependAutoloader = false): GeneratedClassAutoloader
    {
        $autoloader = new GeneratedClassAutoloader($namespace, $directory, $prependAutoloader);
        $autoloader->registerLoader();
        return $autoloader;
    }
    /**
     * Register machine type and its provider
     *
     * @param SmalldbProviderInterface $provider
     * @param string[] $aliases
     */
    public function registerMachineType(SmalldbProviderInterface $provider, array $aliases = [])
    {
        $machineType = $provider->getMachineType();
        if (isset($this->machineProviders[$machineType])) {
            throw new InvalidArgumentException('Duplicate machine type: ' . $machineType);
        }
        $this->machineProviders[$machineType] = $provider;
        $this->machineTypes[] = $machineType;
        foreach ($aliases as $alias) {
            if (isset($this->machineProviders[$alias])) {
                throw new InvalidArgumentException('Duplicate machine type (alias): ' . $alias);
            }
            $this->machineProviders[$alias] = $provider;
        }
    }
    /**
     * Retrieve a machine provider for the given machine type or reference class.
     */
    public function getMachineProvider(string $machineType): SmalldbProviderInterface
    {
        if (isset($this->machineProviders[$machineType])) {
            return $this->machineProviders[$machineType];
        } else {
            throw new InvalidArgumentException('Undefined machine type: ' . $machineType);
        }
    }
    public function getReferenceClass(string $type): string
    {
        return $this->getMachineProvider($type)->getReferenceClass();
    }
    public function getDefinition(string $type): StateMachineDefinition
    {
        return $this->getMachineProvider($type)->getDefinition();
    }
    public function getTransitionsDecorator(string $type): TransitionDecorator
    {
        return $this->getMachineProvider($type)->getTransitionsDecorator();
    }
    public function getRepository(string $type): SmalldbRepositoryInterface
    {
        return $this->getMachineProvider($type)->getRepository();
    }
    /**
     * Get reference to state machine instance of given type and id.
     *
     * @see nullRef()
     */
    public function ref(string $type, $id): ReferenceInterface
    {
        return $this->getRepository($type)->ref($id);
        // TODO: Emit events
        /*
        if ($this->debug_logger) {
            $this->debug_logger->afterReferenceCreated($this, $machineProvider, $ref);
        }
        if ($this->after_reference_created) {
            $this->after_reference_created->emit($ref);
        }
        */
    }
    /**
     * Get reference to non-existent state machine instance of given type. 
     * You may want to invoke 'create' or similar transition using this 
     * reference.
     *
     * @see ref()
     */
    public function nullRef(string $type): ReferenceInterface
    {
        return $this->getRepository($type)->ref(null);
    }
    /**
     * Generate list of all machines.
     *
     * @return string[]
     */
    public function getMachineTypes(): array
    {
        return $this->machineTypes;
    }
    public function setDebugLogger(?DebugLoggerInterface $debugLogger): void
    {
        $this->debugLogger = $debugLogger;
    }
    public function getDebugLogger(): ?DebugLoggerInterface
    {
        return $this->debugLogger;
    }
}