public static function &get($_this, $name)
{
$class = get_class($_this);
$uname = ucfirst($name);
$methods =& self::getMethods($class);
if ($name === '') {
throw new MemberAccessException("Cannot read a class '{$class}' property without name.");
} elseif (isset($methods[$m = 'get' . $uname]) || isset($methods[$m = 'is' . $uname])) {
// property getter
if ($methods[$m] === 0) {
$methods[$m] = (new \ReflectionMethod($class, $m))->returnsReference();
}
if ($methods[$m] === TRUE) {
return $_this->{$m}();
} else {
$val = $_this->{$m}();
return $val;
}
} elseif (isset($methods[$name])) {
// public method as closure getter
if (preg_match('#^(is|get|has)([A-Z]|$)#', $name) && !(new \ReflectionMethod($class, $name))->getNumberOfRequiredParameters()) {
trigger_error("Did you forget parentheses after {$name}" . self::getSource() . '?', E_USER_WARNING);
}
$val = Callback::closure($_this, $name);
return $val;
} elseif (isset($methods['set' . $uname])) {
// property getter
throw new MemberAccessException("Cannot read a write-only property {$class}::\${$name}.");
} else {
self::strictGet($class, $name);
}
}