public function replace(
        $hookName,
        $functionToReplace,
        $callable,
        $priority = 10,
        $acceptedArguments = 1,
        $create = true
    ) :bool {
        $hookName = $this->sanitizeKeyName($hookName);
        if (!$hookName) {
            throw new InvalidArgumentException(
                "Invalid Hook Name Specified",
                E_USER_ERROR
            );
        }

        if (!is_callable($callable)) {
            throw new RuntimeException(
                "Invalid Hook Callable Specified",
                E_USER_ERROR
            );
        }

        if (($has = $this->exists($hookName, $functionToReplace)) || $create) {
            $has && $this->remove($hookName, $functionToReplace);
            // add hooks first
            return $this->add($hookName, $callable, $priority, $acceptedArguments);
        }

        return false;
    }