public function run(...$args): bool
    {
        $this->channel = new Channel($this->messageBuffer);

        $this->pid = pcntl_fork();

        // If $pid is set, we are in the parent process
        if ($this->pid) {
            // If we want the process to run asynchronously,
            // we can just store the PID and abandon it
            if ($this->async) {
                // Store the communication channel for the process
                $this->asyncChannels[$this->pid] = $this->channel;

                return true;
            }

            // Wait for the child process to complete before continuing
            return $this->wait();
        }

        // If $pid is not set, we are in the child process
        if (!$this->pid) {
            // Bind the channel as the $this argument within the handler
            $handler = $this->handler;
            $handler = $handler->bindTo($this->channel);

            // Call the handler
            $successful = $handler(...$args);

            // Capture the return value from the function and use
            // it to set the exit status for the process
            $status = $successful ? 0 : 1;

            // Exit the child process
            exit($status);
        }

        // We shouldn't ever get this far, so if we do
        // something went wrong
        return false;
    }