Completed
Push — master ( 9cfcfd...a0da2a )
by Mr
01:55
created

Client::__get()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 28

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
dl 0
loc 28
ccs 0
cts 17
cp 0
rs 9.472
c 0
b 0
f 0
cc 4
nc 5
nop 1
crap 20
1
<?php
2
3
namespace Rezdy;
4
5
use BadMethodCallException;
6
use ErrorException;
7
use GuzzleHttp\Exception\ClientException;
8
9
// Root query
10
use Rezdy\Interfaces\QueryInterface;
11
12
// Availability
13
use Rezdy\Interfaces\AvailabilityInterface as Availability;
14
15
// Products
16
use Rezdy\Interfaces\ProductsInterface as Products;
17
use Rezdy\Interfaces\ProductInterface as Product;
18
19
/**
20
 * @property Products     $products      Products management
21
 * @property Availability $availability  Availability of products
22
 *
23
 * @method Product product(string $productCode)
24
 *
25
 * Single entry point for all classes
26
 *
27
 * @package Rezdy
28
 */
29
class Client implements QueryInterface
30
{
31
    use HttpTrait;
32
33
    /**
34
     * @var string
35
     */
36
    protected $namespace = __NAMESPACE__ . '\\Endpoints';
37
38
    /**
39
     * Type of query
40
     *
41
     * @var string
42
     */
43
    protected $type;
44
45
    /**
46
     * Endpoint of query
47
     *
48
     * @var string
49
     */
50
    protected $endpoint;
51
52
    /**
53
     * Parameters of query
54
     *
55
     * @var mixed
56
     */
57
    protected $params;
58
59
    /**
60
     * @var array
61
     */
62
    protected static $variables = [];
63
64
    /**
65
     * API constructor.
66
     *
67
     * @param string|array|Config $config
68
     *
69
     * @throws \ErrorException
70
     */
71
    public function __construct($config)
72
    {
73
        // If string then it's a token
74
        if (is_string($config)) {
75
            $config = new Config(['api_key' => $config]);
76
        }
77
78
        // If array then need create object
79
        if (is_array($config)) {
80
            $config = new Config($config);
81
        }
82
83
        // Save config into local variable
84
        $this->config = $config;
85
86
        // Store the client object
87
        $this->client = new \GuzzleHttp\Client($config->guzzle());
88
    }
89
90
    /**
91
     * Convert underscore_strings to camelCase (medial capitals).
92
     *
93
     * @param string $str
94
     *
95
     * @return string
96
     */
97
    private function snakeToPascal(string $str): string
98
    {
99
        // Remove underscores, capitalize words
100
        return str_replace(' ', '', ucwords(str_replace('_', ' ', $str)));
101
    }
102
103
    /**
104
     * Magic method required for call of another classes
105
     *
106
     * @param string $name
107
     *
108
     * @return bool|object
109
     * @throws \BadMethodCallException
110
     */
111
    public function __get(string $name)
112
    {
113
        if (isset(self::$variables[$name])) {
114
            return self::$variables[$name];
115
        }
116
117
        // By default return is empty
118
        $object = '';
119
120
        // Set class name as namespace
121
        $class = $this->namespace . '\\' . $this->snakeToPascal($name);
122
123
        try {
124
125
            // Try to create object by name
126
            $object = new $class($this->config);
127
128
        } catch (ErrorException | ClientException $e) {
129
            echo $e->getMessage();
130
        }
131
132
        // If object is not created
133
        if (!is_object($object)) {
134
            throw new BadMethodCallException("Class $class could not to be loaded");
135
        }
136
137
        return $object;
138
    }
139
140
    /**
141
     * Magic method required for call of another classes
142
     *
143
     * @param string $name
144
     * @param array  $arguments
145
     *
146
     * @return bool|object
147
     * @throws \BadMethodCallException
148
     */
149
    public function __call(string $name, array $arguments)
150
    {
151
        // By default return is empty
152
        $object = '';
153
154
        // Set class name as namespace
155
        $class = $this->namespace . '\\' . $this->snakeToPascal($name) . 's';
156
157
        try {
158
159
            // Try to create object by name
160
            $object = new $class($this->config);
161
162
        } catch (ErrorException | ClientException $e) {
163
            echo $e->getMessage();
164
        }
165
166
        // If object is not created
167
        if (!is_object($object)) {
168
            throw new BadMethodCallException("Class $class could not to be loaded");
169
        }
170
171
        return call_user_func_array($object, $arguments);
172
    }
173
174
    /**
175
     * Check if class is exist in folder
176
     *
177
     * @param string $name
178
     *
179
     * @return bool
180
     */
181
    public function __isset(string $name): bool
182
    {
183
        return isset(self::$variables[$name]);
184
    }
185
186
    /**
187
     * Ordinary dummy setter, it should be ignored (added to PSR reasons)
188
     *
189
     * @param string $name
190
     * @param mixed  $value
191
     *
192
     * @throws \BadMethodCallException
193
     */
194
    public function __set(string $name, $value)
195
    {
196
        self::$variables[$name] = $value;
197
    }
198
}
199