public function signal($signal = null, array $variables = [], array $delegation = [])
    {
        if ($this->isTerminated()) {
            throw new \RuntimeException(sprintf('Cannot signal terminated %s', $this));
        }
        
        if (!$this->isWaiting()) {
            throw new \RuntimeException(sprintf('%s is not in a wait state', $this));
        }
        
        $this->engine->pushCommand($this->engine->createSignalExecutionCommand($this, $signal, $variables, $delegation));
    }