public function readProperties($root = null, $web = null, $vendor = null)
    {
        if (!$this->propertiesRead) {
            if (is_null($root)) {
                if (is_callable([$this, 'taskDetermineProjectRoot'])) {
                    $this->taskDetermineProjectRoot()->run();
                }
                $root = $this->getConfig()->get('digipolis.root.project', getcwd());
            }
            if (is_null($web)) {
                if (is_callable([$this, 'taskDetermineWebRoot'])) {
                    $this->taskDetermineWebRoot()->run();
                }
                $web = $this->getConfig()->get('digipolis.root.web', $root);
            }
            if (is_null($vendor)) {
                $vendor = $root . '/vendor';
            }
            $this->taskReadProperties([$web, $vendor])->run();
            $this->propertiesRead = true;
        }
    }