-
Notifications
You must be signed in to change notification settings - Fork 35
/
PropertyMethods.php
108 lines (88 loc) · 2.44 KB
/
PropertyMethods.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
/**
* This file is part of the Lean Mapper library (http://www.leanmapper.com)
*
* Copyright (c) 2013 Vojtěch Kohout (aka Tharos)
*
* For the full copyright and license information, please view the file
* license.md that was distributed with this source code.
*/
namespace LeanMapper\Reflection;
use LeanMapper\Exception\InvalidAnnotationException;
/**
* Set of property access methods (given in useMethods flag)
*
* @author Vojtěch Kohout
*/
class PropertyMethods
{
/** @var string */
private $getter;
/** @var string|null */
private $setter;
/**
* @param string
* @param string|null
*/
public function __construct($getter, $setter)
{
$this->getter = $getter;
$this->setter = $setter;
}
/**
* Gets getter method
*
* @return string|null
*/
public function getGetter()
{
return $this->getter;
}
/**
* Gets setter method
*
* @return string|null
*/
public function getSetter()
{
return $this->setter;
}
/**
* @param string $propertyName
* @param bool $isWritable
* @param string $definition
* @return static
* @throws InvalidAnnotationException
*/
public static function createFromDefinition($propertyName, $isWritable, $definition)
{
$ucName = ucfirst($propertyName);
$getter = 'get' . $ucName;
$setter = null;
if ($isWritable) {
$setter = 'set' . $ucName;
}
$counter = 0;
foreach (preg_split('#\s*\|\s*#', trim($definition)) as $method) {
$counter++;
if ($counter > 2) {
throw new InvalidAnnotationException('Property methods cannot have more than two parts.');
}
if ($method === '') {
continue;
}
if (!preg_match('#^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$#', $method)) {
throw new InvalidAnnotationException("Malformed access method name given: '$method'.");
}
if ($counter === 1) {
$getter = $method;
} else { // $counter === 2
if (!$isWritable) {
throw new InvalidAnnotationException('Property methods can have one part only in read-only properties.');
}
$setter = $method;
}
}
return new static($getter, $setter);
}
}