public function setProperty($ns, $name, $value, $verbose)
    {
        // user (CLI) properties take precedence
        if (isset($this->userProperties[$name])) {
            if ($verbose) {
                self::$project->log('Override ignored for user property ' . $name, Project::MSG_VERBOSE);
            }
            return false;
        }

        $done = $this->setPropertyHook($ns, $name, $value, false, false, false);
        if ($done) {
            return true;
        }

        if ($verbose && isset($this->properties[$name])) {
            self::$project->log(
                'Overriding previous definition of property ' . $name,
                Project::MSG_VERBOSE
            );
        }

        if ($verbose) {
            self::$project->log(
                'Setting project property: ' . $name . " -> "
                . $value,
                Project::MSG_DEBUG
            );
        }
        $this->properties[$name] = $value;
        self::$project->addReference($name, new PropertyValue($value));
        return true;
    }