public function setIcon($icon = '')
    {
        if (!is_string($icon)) {
            throw new BuildException(
                '"icon" attribute is invalid.' .
                ' Expect to be a string, actual is ' . gettype($icon)
            );
        }

        // relative location
        if (strpos($icon, '..') === 0) {
            $icon = realpath(__DIR__ . DIRECTORY_SEPARATOR . $icon);
        } elseif (strpos($icon, '.') === 0) {
            $icon = __DIR__ . substr($icon, 1);
        }

        $this->icon = $icon;
    }