Completed
Push — master ( 9ae88c...ded41a )
by ARCANEDEV
25s queued 10s
created

Agent::__call()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 4
cts 4
cp 1
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 2
crap 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Arcanedev\Agent;
6
7
use Arcanedev\Agent\Contracts\{Agent as AgentContract, Detector};
8
use BadMethodCallException;
9
use Illuminate\Contracts\Foundation\Application;
10
use Illuminate\Http\Request;
11
12
/**
13
 * Class     Agent
14
 *
15
 * @package  Arcanedev\Agent
16
 * @author   ARCANEDEV <[email protected]>
17
 *
18
 * @method  \Arcanedev\Agent\Detectors\DeviceDetector   drive()
19
 * @method  \Arcanedev\Agent\Detectors\LanguageDetector language()
20
 */
21
class Agent implements AgentContract
22
{
23
    /* -----------------------------------------------------------------
24
     |  Properties
25
     | -----------------------------------------------------------------
26
     */
27
28
    /**
29
     * @var \Illuminate\Contracts\Foundation\Application
30
     */
31
    protected $app;
32
33
    /**
34
     * @var \Illuminate\Http\Request
35
     */
36
    protected $request;
37
38
    /**
39
     * Parsed request.
40
     *
41
     * @var array
42
     */
43
    protected $parsed;
44
45
    /* -----------------------------------------------------------------
46
     |  Constructor
47
     | -----------------------------------------------------------------
48
     */
49
50
    /**
51
     * Agent constructor.
52
     *
53
     * @param  \Illuminate\Contracts\Foundation\Application  $app
54
     */
55 384
    public function __construct(Application $app)
56
    {
57 384
        $this->app = $app;
58 384
    }
59
60
    /* -----------------------------------------------------------------
61
     |  Getters & Setters
62
     | -----------------------------------------------------------------
63
     */
64
65
    /**
66
     * Set the request instance.
67
     *
68
     * @param  \Illuminate\Http\Request  $request
69
     *
70
     * @return $this
71
     */
72 372
    public function setRequest(Request $request)
73
    {
74 372
        $this->request = $request;
75
76 372
        return $this;
77
    }
78
79
    /**
80
     * Get the request instance.
81
     *
82
     * @return \Illuminate\Http\Request
83
     */
84 372
    public function getRequest(): Request
85
    {
86 372
        return $this->request;
87
    }
88
89
    /**
90
     * Get the detectors.
91
     *
92
     * @return array
93
     */
94 378
    protected function detectors(): array
95
    {
96 378
        return $this->app['config']['agent.detectors'];
97
    }
98
99
    /**
100
     * @param  string  $key
101
     *
102
     * @return \Arcanedev\Agent\Contracts\Detector|mixed
103
     */
104 372
    protected function getParsed(string $key): Detector
105
    {
106 372
        return $this->parsed[$key];
107
    }
108
109
    /* -----------------------------------------------------------------
110
     |  Main Methods
111
     | -----------------------------------------------------------------
112
     */
113
114
    /**
115
     * Parse the given request.
116
     *
117
     * @param  \Illuminate\Http\Request|null  $request
118
     *
119
     * @return $this
120
     */
121 372
    public function parse(Request $request = null): AgentContract
122
    {
123 372
        if ( ! is_null($request)) {
124 366
            $this->setRequest($request);
125
        }
126
127 372
        foreach ($this->detectors() as $key => $detector) {
128 372
            $this->parsed[$key] = call_user_func_array([$this->app->make($detector['driver']), 'handle'], [$this->getRequest()]);
129
        }
130
131 372
        return $this;
132
    }
133
134
    /* -----------------------------------------------------------------
135
     |  Check Methods
136
     | -----------------------------------------------------------------
137
     */
138
139
    /**
140
     * Check if the detector exists.
141
     *
142
     * @param  string  $name
143
     *
144
     * @return bool
145
     */
146 378
    protected function hasDetector(string $name): bool
147
    {
148 378
        return array_key_exists($name, $this->detectors());
149
    }
150
151
    /* -----------------------------------------------------------------
152
     |  Other Methods
153
     | -----------------------------------------------------------------
154
     */
155
156
    /**
157
     * @param  string  $name
158
     * @param  array   $params
159
     *
160
     * @return \Arcanedev\Agent\Contracts\Detector
161
     */
162 378
    public function __call($name, $params)
163
    {
164 378
        if ($this->hasDetector($name)) {
165 372
            return $this->getParsed($name);
166
        }
167
168 6
        throw new BadMethodCallException("Method [{$name}] not found");
169
    }
170
}
171