public function generateSignature()
    {
        if ($this->isFinal() === true && $this->isAbstract() === true) {
            throw new RuntimeException('A method can not be "abstract" and "final".');
        }

        if ($this->isAbstract() === true && $this->getVisibility() === Modifiers::VISIBILITY_PRIVATE) {
            throw new RuntimeException('A method can not be "abstract" and "private".');
        }

        $signature = $this->getIndentation();
        if ($this->isFinal() === true) {
            $signature .= 'final ';
        } elseif ($this->isAbstract()) {
            $signature .= 'abstract ';
        }

        $signature .= $this->getVisibility();

        if ($this->isStatic() === true) {
            $signature .= ' static';
        }

        return $signature . ' function ' . $this->name . '(' . implode(', ', $this->parameters) . ')';
    }