/**
* Get an reflection property that you can access directly.
*
* @param object|string $objectOrClass
* @param string $propertyName
*
* @return \ReflectionProperty
*
* @throws \InvalidArgumentException
* @throws \LogicException if the property is not found on the object
*/
protected static function getAccessibleReflectionProperty($objectOrClass, $propertyName)
{
Assert::string($propertyName, 'Property name must be a string. Variable of type "%s" was given.');
$class = $objectOrClass;
if (!is_string($objectOrClass)) {
Assert::object($objectOrClass, 'Can not get a property of a non object. Variable of type "%s" was given.');
Assert::notInstanceOf($objectOrClass, '\\stdClass', 'Can not get a property of \\stdClass.');
$class = get_class($objectOrClass);
}
if (null === ($refl = static::getReflectionClassWithProperty($class, $propertyName))) {
throw new \LogicException(sprintf('The property %s does not exist on %s or any of its parents.', $propertyName, $class));
}
$property = $refl->getProperty($propertyName);
$property->setAccessible(true);
if (!$property->isStatic()) {
Assert::object($objectOrClass, 'Can not access non-static property without an object.');
}
return $property;
}