ScoreTransition   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 57
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 92.86%

Importance

Changes 0
Metric Value
wmc 9
c 0
b 0
f 0
lcom 1
cbo 3
dl 0
loc 57
ccs 26
cts 28
cp 0.9286
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 2
A calculcateScore() 0 12 3
A selectTransition() 0 16 4
1
<?php
2
3
namespace Metabor\Statemachine\Factory\TransitionSelector;
4
5
use MetaborStd\Statemachine\Factory\TransitionSelectorInterface;
6
use MetaborStd\Statemachine\TransitionInterface;
7
8
/**
9
 * @author otischlinger
10
 */
11
class ScoreTransition implements TransitionSelectorInterface
12
{
13
    /**
14
     * @var TransitionSelectorInterface
15
     */
16
    protected $innerSelector;
17
18
    /**
19
     * @param TransitionSelectorInterface|null $innerSelector
20
     */
21 5
    public function __construct(TransitionSelectorInterface $innerSelector = null)
22
    {
23 5
        if ($innerSelector) {
24
            $this->innerSelector = $innerSelector;
25
        } else {
26 5
            $this->innerSelector = new OneOrNoneActiveTransition();
27
        }
28 5
    }
29
30
    /**
31
     * @param TransitionInterface $transition
32
     *
33
     * @return int
34
     */
35 5
    protected function calculcateScore(TransitionInterface $transition)
36
    {
37 5
        $score = 0;
38 5
        if ($transition->getEventName()) {
39 2
            $score += 2;
40 2
        }
41 5
        if ($transition->getConditionName()) {
42 2
            ++$score;
43 2
        }
44
45 5
        return $score;
46
    }
47
48
    /**
49
     * @see \MetaborStd\Statemachine\Factory\TransitionSelectorInterface::selectTransition()
50
     */
51 5
    public function selectTransition(\Traversable $transitions)
52
    {
53 5
        $bestTransitions = array();
54 5
        $bestScore = -1;
55 5
        foreach ($transitions as $transition) {
56 5
            $score = $this->calculcateScore($transition);
57 5
            if ($score > $bestScore) {
58 5
                $bestScore = $score;
59 5
                $bestTransitions = array($transition);
60 5
            } elseif ($score == $bestScore) {
61 1
                $bestTransitions[] = $transition;
62 1
            }
63 5
        }
64
65 5
        return $this->innerSelector->selectTransition(new \ArrayIterator($bestTransitions));
66
    }
67
}
68