|
1 | 1 | <?php namespace lang\reflection; |
2 | 2 |
|
3 | | -use lang\Value; |
| 3 | +use lang\{Value, IllegalArgumentException}; |
4 | 4 |
|
5 | 5 | /** |
6 | 6 | * Type and member modifiers |
7 | 7 | * |
8 | 8 | * @test lang.reflection.unittest.ModifiersTest |
9 | 9 | */ |
10 | 10 | class Modifiers implements Value { |
11 | | - const IS_STATIC = MODIFIER_STATIC; |
12 | | - const IS_ABSTRACT = MODIFIER_ABSTRACT; |
13 | | - const IS_FINAL = MODIFIER_FINAL; |
14 | | - const IS_PUBLIC = MODIFIER_PUBLIC; |
15 | | - const IS_PROTECTED = MODIFIER_PROTECTED; |
16 | | - const IS_PRIVATE = MODIFIER_PRIVATE; |
17 | | - const IS_READONLY = 0x0080; // XP 10.13: MODIFIER_READONLY |
18 | | - const IS_NATIVE = 0xF000; |
| 11 | + const IS_STATIC = MODIFIER_STATIC; |
| 12 | + const IS_ABSTRACT = MODIFIER_ABSTRACT; |
| 13 | + const IS_FINAL = MODIFIER_FINAL; |
| 14 | + const IS_PUBLIC = MODIFIER_PUBLIC; |
| 15 | + const IS_PROTECTED = MODIFIER_PROTECTED; |
| 16 | + const IS_PRIVATE = MODIFIER_PRIVATE; |
| 17 | + const IS_READONLY = MODIFIER_READONLY; |
| 18 | + const IS_PRIVATE_SET = 0x0400; |
| 19 | + const IS_PROTECTED_SET = 0x0800; |
| 20 | + const IS_PUBLIC_SET = 0x1000; |
| 21 | + const IS_NATIVE = 0x10000; |
19 | 22 |
|
20 | 23 | private static $names= [ |
21 | | - 'public' => self::IS_PUBLIC, |
22 | | - 'protected' => self::IS_PROTECTED, |
23 | | - 'private' => self::IS_PRIVATE, |
24 | | - 'static' => self::IS_STATIC, |
25 | | - 'final' => self::IS_FINAL, |
26 | | - 'abstract' => self::IS_ABSTRACT, |
27 | | - 'native' => self::IS_NATIVE, |
28 | | - 'readonly' => self::IS_READONLY, |
| 24 | + 'public' => self::IS_PUBLIC, |
| 25 | + 'protected' => self::IS_PROTECTED, |
| 26 | + 'private' => self::IS_PRIVATE, |
| 27 | + 'static' => self::IS_STATIC, |
| 28 | + 'final' => self::IS_FINAL, |
| 29 | + 'abstract' => self::IS_ABSTRACT, |
| 30 | + 'native' => self::IS_NATIVE, |
| 31 | + 'readonly' => self::IS_READONLY, |
| 32 | + 'private(set)' => self::IS_PRIVATE_SET, |
| 33 | + 'protected(set)' => self::IS_PROTECTED_SET, |
| 34 | + 'public(set)' => self::IS_PUBLIC_SET, |
29 | 35 | ]; |
30 | 36 | private $bits; |
31 | 37 |
|
@@ -103,19 +109,55 @@ public function isAbstract() { return 0 !== ($this->bits & self::IS_ABSTRACT); } |
103 | 109 | public function isFinal() { return 0 !== ($this->bits & self::IS_FINAL); } |
104 | 110 |
|
105 | 111 | /** @return bool */ |
106 | | - public function isPublic() { return 0 !== ($this->bits & self::IS_PUBLIC); } |
| 112 | + public function isNative() { return 0 !== ($this->bits & self::IS_NATIVE); } |
107 | 113 |
|
108 | 114 | /** @return bool */ |
109 | | - public function isProtected() { return 0 !== ($this->bits & self::IS_PROTECTED); } |
| 115 | + public function isReadonly() { return 0 !== ($this->bits & self::IS_READONLY); } |
110 | 116 |
|
111 | | - /** @return bool */ |
112 | | - public function isPrivate() { return 0 !== ($this->bits & self::IS_PRIVATE); } |
| 117 | + /** |
| 118 | + * Gets whether these modifiers are public in regard to the specified hook |
| 119 | + * |
| 120 | + * @param ?string $hook |
| 121 | + * @return bool |
| 122 | + * @throws lang.IllegalArgumentException |
| 123 | + */ |
| 124 | + public function isPublic($hook= 'get') { |
| 125 | + switch ($hook) { |
| 126 | + case 'get': return 0 !== ($this->bits & self::IS_PUBLIC); |
| 127 | + case 'set': return 0 !== ($this->bits & self::IS_PUBLIC_SET); |
| 128 | + default: throw new IllegalArgumentException('Unknown hook '.$hook); |
| 129 | + } |
| 130 | + } |
113 | 131 |
|
114 | | - /** @return bool */ |
115 | | - public function isNative() { return 0 !== ($this->bits & self::IS_NATIVE); } |
| 132 | + /** |
| 133 | + * Gets whether these modifiers are protected in regard to the specified hook |
| 134 | + * |
| 135 | + * @param ?string $hook |
| 136 | + * @return bool |
| 137 | + * @throws lang.IllegalArgumentException |
| 138 | + */ |
| 139 | + public function isProtected($hook= 'get') { |
| 140 | + switch ($hook) { |
| 141 | + case 'get': return 0 !== ($this->bits & self::IS_PROTECTED); |
| 142 | + case 'set': return 0 !== ($this->bits & self::IS_PROTECTED_SET); |
| 143 | + default: throw new IllegalArgumentException('Unknown hook '.$hook); |
| 144 | + } |
| 145 | + } |
116 | 146 |
|
117 | | - /** @return bool */ |
118 | | - public function isReadonly() { return 0 !== ($this->bits & self::IS_READONLY); } |
| 147 | + /** |
| 148 | + * Gets whether these modifiers are private in regard to the specified hook |
| 149 | + * |
| 150 | + * @param ?string $hook |
| 151 | + * @return bool |
| 152 | + * @throws lang.IllegalArgumentException |
| 153 | + */ |
| 154 | + public function isPrivate($hook= 'get') { |
| 155 | + switch ($hook) { |
| 156 | + case 'get': return 0 !== ($this->bits & self::IS_PRIVATE); |
| 157 | + case 'set': return 0 !== ($this->bits & self::IS_PRIVATE_SET); |
| 158 | + default: throw new IllegalArgumentException('Unknown hook '.$hook); |
| 159 | + } |
| 160 | + } |
119 | 161 |
|
120 | 162 | /** |
121 | 163 | * Compares a given value to this modifiers instance |
|
0 commit comments