1: <?php
2: /**
3: * @package OpenCart
4: *
5: * @author Daniel Kerr
6: * @copyright Copyright (c) 2005 - 2022, OpenCart, Ltd. (https://www.opencart.com/)
7: * @license https://opensource.org/licenses/GPL-3.0
8: *
9: * @see https://www.opencart.com
10: */
11: namespace Opencart\System\Engine;
12: /**
13: * Class Proxy
14: *
15: * @template TWraps of \Opencart\System\Engine\Model
16: *
17: * @mixin TWraps
18: */
19: class Proxy {
20: /**
21: * @var array<string, object>
22: */
23: protected array $data = [];
24:
25: /**
26: * __get
27: *
28: * @param string $key
29: *
30: * @return mixed
31: */
32: public function &__get(string $key) {
33: if (isset($this->data[$key])) {
34: return $this->data[$key];
35: } else {
36: throw new \Exception('Error: Could not call proxy key ' . $key . '!');
37: }
38: }
39:
40: /**
41: * __set
42: *
43: * @param string $key
44: * @param object $value
45: *
46: * @return void
47: */
48: public function __set(string $key, object $value): void {
49: $this->data[$key] = $value;
50: }
51:
52: /**
53: * __isset
54: *
55: * @param string $key
56: *
57: * @return bool
58: */
59: public function __isset(string $key): bool {
60: return isset($this->data[$key]);
61: }
62:
63: /**
64: * __unset
65: *
66: * @param string $key
67: *
68: * @return void
69: */
70: public function __unset(string $key): void {
71: unset($this->data[$key]);
72: }
73:
74: /**
75: * __call
76: *
77: * @param string $method
78: * @param array<string, mixed> $args
79: *
80: * @return mixed
81: */
82: public function __call(string $method, array $args) {
83: // Hack for pass-by-reference
84: foreach ($args as $key => &$value);
85:
86: if (isset($this->data[$method])) {
87: return ($this->data[$method])(...$args);
88: } else {
89: $trace = debug_backtrace();
90:
91: throw new \Exception('<b>Notice</b>: Undefined property: Proxy::' . $method . ' in <b>' . $trace[0]['file'] . '</b> on line <b>' . $trace[0]['line'] . '</b>');
92: }
93: }
94: }
95: