protected function send(array $query)
    {
        if (!$this->key || !$this->secret || !$this->from) {
            throw new Exception\ConfigurationException(
                "Invalid configuration. Missing key, secret, or from."
            );
        }
        
        $query["api_key"]           = $this->key;
        $query["api_secret"]        = $this->secret;
        $query["from"]              = $this->from;
        $query["status-report-req"] = $this->status_report_req;
        if ($this->ttl) {
            $query["ttl"] = $this->ttl;
        }
        
        $response = $this->guzzle->get(self::API_URI, [
            "query" => $query
        ])->json();

        /**
         * @var Message[] $messages
         * @var Exception\Exception[] $exceptions
         */
        $messages   = [];
        $exceptions = [];
        foreach($response["messages"] as $message) {
            if ($message["status"] != 0) {
                $exceptions[] = Exception\Factory::factory(
                    $message["error-text"],
                    $message["status"]
                );
            } else {
                $messages[] = new Message($message);
            }
        }
        
        $response = new Response($messages, $exceptions);
        if ($exceptions) {
            $exceptions[0]->setResponse($response);
            throw $exceptions[0];
        }
        
        return $response;
    }