/**
  * Process requested endpoint 
  * @return mixed 	Endpoint result 
  */
 public function endpoint_process()
 {
     $og_endpoint = $this->server->original_endpoint;
     // Check if endpoint exists in dictionary
     $og_exists = Dictionary::exists($og_endpoint);
     if ($og_exists) {
         try {
             // Get endpoint query
             $query = Dictionary::get_query($og_exists);
             // Before callback function call
             if ($before = Dictionary::get_before($og_exists)) {
                 if (is_callable($before)) {
                     $query['q']['q'] = call_user_func($before, $query['q']['q']);
                 }
             }
             // Check is endpoint is cacheable
             $cacheable = Dictionary::is_cacheable($og_exists);
             if (!$query) {
                 throw new APIexception('Endpoint not found', 6, 404);
             } elseif ($query['method'] !== $this->server->method) {
                 throw new APIexception('Method mismatch. You should use ' . $query['method'], 11, 400);
             }
             // Request security for endpoints with security enabled
             if ($query['signed']) {
                 if (SECURE_TYPE === "oauth1.0a") {
                     if (OAuth1\OAuthRequestVerifier::requestIsSigned()) {
                         try {
                             $req = new OAuth1\OAuthRequestVerifier();
                             if (!$req->verify()) {
                                 throw new APIexception('Unauthorized request.', 15, 401);
                             }
                         } catch (OAuth1\OAuthException2 $e) {
                             throw new APIexception('OAuth error: ' . $e->getMessage(), 15, 401);
                         }
                     } else {
                         throw new APIexception('Unauthorized request.', 15, 401);
                     }
                 }
             }
             // Retrieves endpoint cache if cache enabled
             if (CACHE && $cacheable) {
                 $cached_content = Cache::search($this->server);
                 if ($cached_content) {
                     // After callback function call
                     if ($after = Dictionary::get_after($og_exists)) {
                         if (is_callable($after)) {
                             $cached_content = call_user_func($after, $cached_content);
                         }
                     }
                     return Output::encode(json_decode($cached_content), $this->server->output, TRUE);
                 }
             }
             // If no cached content, create file if cache enabled
             if (empty($cached_content)) {
                 $data = $this->server->data;
                 $filters = $this->server->args;
                 $res = Query::execute($query["q"], TRUE, $data, $filters);
                 if ($query['q']['join']) {
                     foreach ($query['q']['join'] as $item => $join_query) {
                         foreach ($res as $num => $response) {
                             $key = Dictionary::get_col_prefix($og_exists) . $item;
                             if (array_key_exists($key, $response)) {
                                 $value = sprintf($join_query, $response[$key]);
                                 if ($joinq = Query::execute(array("q" => $value), TRUE)) {
                                     if (count($joinq) > 1) {
                                         $res[$num][$key] = $joinq;
                                     } else {
                                         $res[$num][$key] = $joinq[0];
                                     }
                                 }
                             }
                         }
                     }
                 }
                 if (CACHE && $cacheable) {
                     $res = Cache::write($res);
                 }
                 // After callback function call
                 if ($after = Dictionary::get_after($og_exists)) {
                     if (is_callable($after)) {
                         $res = call_user_func($after, $res);
                     }
                 }
                 return Output::encode($res, $this->server->output);
             }
         } catch (APIexception $e) {
             die($e->output());
         }
     }
 }