<?php

/**
 * PHP version 7.3
 *
 * @category ReflectionUtils
 * @package  RetailCrm\TestUtils
 */

namespace RetailCrm\TestUtils;

use ReflectionProperty;

/**
 * Class ReflectionUtils
 *
 * @category ReflectionUtils
 * @package  RetailCrm\TestUtils
 */
class ReflectionUtils
{
    /**
     * Extracts property from provided object.
     *
     * @param object $object
     * @param string $property
     *
     * @return mixed
     * @throws \ReflectionException
     */
    public static function getProperty(object $object, string $property)
    {
        return static::getReflectionProperty($object, $property)->getValue($object);
    }

    /**
     * @param object $object
     * @param string $property
     * @param mixed  $value
     *
     * @throws \ReflectionException
     */
    public static function setProperty(object $object, string $property, $value): void
    {
        static::getReflectionProperty($object, $property)->setValue($object, $value);
    }

    /**
     * @param object $object
     * @param string $property
     *
     * @return \ReflectionProperty
     * @throws \ReflectionException
     */
    private static function getReflectionProperty(object $object, string $property): ReflectionProperty
    {
        $prop = new ReflectionProperty($object, $property);
        $prop->setAccessible(true);

        return $prop;
    }
}