final public function hasProperty($property)
    {
        if (!Str::is($property)
            || !Str::match($property, "/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/")
            || $property == 'this'
        ) {
            throw new \InvalidArgumentException(
                "The \$property parameter must be a string and follow the PHP rules of variable naming."
            );
        }

        return property_exists($this, $property);
    }