public static function getPropertyForKeyOrDefault(&$data, string $property, $default, bool $ignoreCase = false, bool $deepSearchDotNotation = false)
    {
        $keyToCheck = $property;
        $objectToCheck = &$data;
        
        if ($ignoreCase) {
            $keyToCheck = strtolower($keyToCheck);
            $objectToCheck = ObjectUtils::changeKeyCase($objectToCheck);
        }
        
        if (property_exists($objectToCheck, $keyToCheck)) {
            return $objectToCheck->$keyToCheck;
        }
        
        if (!$deepSearchDotNotation || strpos($keyToCheck, ".") === false) {
            return $default;
        }
        
        $keySeparated = explode('.', $keyToCheck);
        $checkOrReturn = &$objectToCheck;
        
        foreach ($keySeparated as $keyPart) {
            if (is_array($data)) {
                $checkOrReturn = ArrayUtils::getArrayValueForKeyOrDefault($checkOrReturn, $keyPart, $default);
                continue;
            }
            
            if (!is_object($checkOrReturn) || !property_exists($checkOrReturn, $keyPart)) {
                $checkOrReturn = &$default;
                break;
            }
            
            $checkOrReturn = &$checkOrReturn->$keyPart;
        }
        
        return $checkOrReturn;
    }