function obtain(\CharlotteDunois\Livia\Commands\Context $context, $provided = array(), $promptLimit = null) {
        if($promptLimit === null) {
            $promptLimit = $this->promptLimit;
        }
    
        $this->client->dispatcher->setAwaiting($context);
        
        $values = array();
        $results = array();
        
        try {
            $promise = $this->obtainNext($context, $provided, $promptLimit, $values, $results, 0)->then(function ($result = null) use ($context, &$values, &$results) {
                $this->client->dispatcher->unsetAwaiting($context);
                
                if($result !== null) {
                    return $result;
                }
                
                return array(
                    'values' => $values,
                    'cancelled' => null,
                    'prompts' => \array_merge(array(), ...\array_map(function (\CharlotteDunois\Livia\Arguments\ArgumentBag $res) {
                        return $res->prompts;
                    }, $results)),
                    'answers' => \array_merge(array(), ...\array_map(function (\CharlotteDunois\Livia\Arguments\ArgumentBag $res) {
                        return $res->answers;
                    }, $results))
                );
            }, function ($error) use ($context) {
                $this->client->dispatcher->unsetAwaiting($context);
                
                throw $error;
            });
            
            $this->client->dispatcher->setAwaiting($context, $promise);
            return $promise;
        } catch (\Throwable $error) {
            $this->client->dispatcher->unsetAwaiting($context);
            
            throw $error;
        }
    }