Passed
Push — master ( 7cb165...6ca639 )
by Carsten
02:26 queued 10s
created

AddressFactory   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 54
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 5
lcom 1
cbo 1
dl 0
loc 54
ccs 16
cts 16
cp 1
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 2
A __invoke() 0 5 1
A apply() 0 15 2
1
<?php
2
namespace Germania\Addresses;
3
4
5
/**
6
 * Creates AddressInterface instances from an associative array.
7
 *
8
 * Example:
9
 *
10
 *     <?php
11
 *     $factory = (new AddressFactory)([
12
 *       'street1'  => 'Street name 1',
13
 *       'street2'  => null,
14
 *       'zip'      => 'DG2JQ',
15
 *       'location' => 'Dumfries',
16
 *       'country'  => 'Scotland'
17
 *     ]);
18
 *
19
 */
20
class AddressFactory
21
{
22
    public $php_address_class;
23
24
    public $default_data = array(
25
        'type'     => null,
26
        'street1'  => null,
27
        'street2'  => null,
28
        'zip'      => null,
29
        'location' => null,
30
        'country'  => null,
31
    );
32
33
    /**
34
     * @param string|null $address_class
35
     */
36 2
    public function __construct(string $address_class = null)
37
    {
38 2
        $this->php_address_class = $address_class ?: Address::class ;
39 2
    }
40
41
42
    /**
43
     * @param  array  $address_data
44
     * @return AddressInterface
45
     */
46 2
    public function __invoke(array $address_data = array()) : AddressInterface
47
    {
48 2
        $address = new $this->php_address_class;
49 2
        return $this->apply($address, $address_data);
50
    }
51
52
53
    /**
54
     * @param  AddressProviderInterface $address_provider
55
     * @param  array|null               $address_data
56
     * @return AddressProviderInterface
57
     */
58 2
    public function apply(AddressProviderInterface $address_provider, array $address_data = null): AddressProviderInterface
59
    {
60 2
        $address = $address_provider->getAddress();
61
62 2
        $raw = array_merge($this->default_data, $address_data ?: array());
63
64 2
        $address->setStreet1(   $raw['street1'])
65 2
                 ->setStreet2(  $raw['street2'])
66 2
                 ->setZip(      $raw['zip'])
67 2
                 ->setLocation( $raw['location'])
68 2
                 ->setCountry(  $raw['country'])
69 2
                 ->setType(     $raw['type']);
70
71 2
        return $address;
72
    }
73
}
74