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

AddressFactory::apply()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 15
ccs 10
cts 10
cp 1
rs 9.7666
c 0
b 0
f 0
cc 2
nc 1
nop 2
crap 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