protected function build()/*# : string */
    {
        // settings
        $settings = $this->getSettings();

        // before build()
        $this->beforeBuild();

        // configs
        $configs  = $this->getConfig();

        // start of result array
        $result = [$this->getType()];

        // seperator & indent
        $sp = $settings['seperator'];
        $in = $settings['indent'];
        $si = $sp . $in;

        foreach ($configs as $pos => $part) {
            // before clause
            if (isset($this->before[$pos])) {
                $result[] = join($sp, $this->before[$pos]);
            }

            $built = call_user_func([$this, $part['func']]);
            if (!empty($built)) {
                $prefix = $part['prefix'] . (empty($part['prefix']) ?
                    ($part['indent'] ? $in : '') : $si);
                $result[] = $prefix . join($part['join'] . $si, $built);
            }

            // after clause
            if (isset($this->after[$pos])) {
                $result[] = join($sp, $this->after[$pos]);
            }
        }

        return join($sp, $result);
    }