GroupsCollection   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 43
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 2
Metric Value
wmc 7
lcom 0
cbo 2
dl 0
loc 43
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
B set() 0 22 6
A add() 0 4 1
1
<?php
2
/**
3
 * Junty
4
 *
5
 * @author Gabriel Jacinto aka. GabrielJMJ <[email protected]>
6
 * @license MIT License
7
 */
8
 
9
namespace Junty\TaskRunner\Task;
10
11
use Junty\TaskRunner\Task\{Group, GroupInterface};
0 ignored issues
show
Bug introduced by
This use statement conflicts with another class in this namespace, Junty\TaskRunner\Task\Group.

Let’s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let’s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
Bug introduced by
This use statement conflicts with another class in this namespace, Junty\TaskRunner\Task\GroupInterface.

Let’s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let’s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
12
use Doctrine\Common\Collections\ArrayCollection;
13
14
class GroupsCollection extends ArrayCollection
15
{
16
    /**
17
     * Registres a group
18
     *
19
     * @param string|TaskInterface $key
20
     * @param callable             $value
21
     */
22
    public function set($key, $value)
23
    {
24
        if ($value !== null && !is_callable($value)) {
25
            throw new \InvalidArgumentException('Callback must be callable.');
26
        }
27
28
        if (!is_string($key) && !$key instanceof GroupInterface) {
29
            throw new \InvalidArgumentException('Pass an instance of TaskInterface or a callback');
30
        }
31
32
        if ($key instanceof GroupInterface) {
33
            parent::set($key->getName(), $key);
34
            return;
35
        }
36
37
        // Pass the group instance in the callback to register tasks
38
        $group = new Group($key);
39
        $cb = \Closure::bind($value, $group);
40
        $cb(); // Updates group instance
41
42
        parent::set($key, $group);
43
    }
44
45
    /**
46
     * Invalid method for group registration
47
     *
48
     * @param mixed $element
49
     *
50
     * @throws \BadMethodCallException
51
     */
52
    public function add($element)
53
    {
54
        throw new \BadMethodCallException('Use GroupsCollection::set to register a group');
55
    }
56
}