public static function getPropertyValue($source, $property, $force = false)
    {
        if (Regex::contains($property, '.')) {
            return self::getPropertyValueByPropertiesChain($source, $property, $force);
        }

        [
            $value,
            $valueFound,
        ] = self::getPropertyValueByReflectionProperty($source, $property);

        if (!$valueFound) {
            [
                $value,
                $valueFound,
            ] = self::getPropertyValueByParentClasses($source, $property);
        }

        if (!$valueFound && ($force || self::hasProperty($source, $property))) {
            [
                $value,
                $valueFound,
            ] = self::getPropertyValueByGetter($source, $property);
        }

        if (!$valueFound) {
            $byReflectionProperty = self::getPropertyValueByReflectionProperty($source, $property);
            $value = $byReflectionProperty[0];
        }

        return $value;
    }