/**
  * Returns a dataformatter instance based on the request
  * extension or mimetype. Falls back to {@link self::$default_extension}.
  * 
  * @param boolean $includeAcceptHeader Determines wether to inspect and prioritize any HTTP Accept headers 
  * @return DataFormatter
  */
 protected function getDataFormatter($includeAcceptHeader = false)
 {
     $extension = $this->request->getExtension();
     $contentTypeWithEncoding = $this->request->getHeader('Content-Type');
     preg_match('/([^;]*)/', $contentTypeWithEncoding, $contentTypeMatches);
     $contentType = $contentTypeMatches[0];
     $accept = $this->request->getHeader('Accept');
     $mimetypes = $this->request->getAcceptMimetypes();
     // get formatter
     if (!empty($extension)) {
         $formatter = DataFormatter::for_extension($extension);
     } elseif ($includeAcceptHeader && !empty($accept) && $accept != '*/*') {
         $formatter = DataFormatter::for_mimetypes($mimetypes);
         if (!$formatter) {
             $formatter = DataFormatter::for_extension(self::$default_extension);
         }
     } elseif (!empty($contentType)) {
         $formatter = DataFormatter::for_mimetype($contentType);
     } else {
         $formatter = DataFormatter::for_extension(self::$default_extension);
     }
     if (!$formatter) {
         return false;
     }
     // set custom fields
     if ($customAddFields = $this->request->getVar('add_fields')) {
         $formatter->setCustomAddFields(explode(',', $customAddFields));
     }
     if ($customFields = $this->request->getVar('fields')) {
         $formatter->setCustomFields(explode(',', $customFields));
     }
     $formatter->setCustomRelations($this->getAllowedRelations($this->urlParams['ClassName']));
     $apiAccess = singleton($this->urlParams['ClassName'])->stat('api_access');
     if (is_array($apiAccess)) {
         $formatter->setCustomAddFields(array_intersect((array) $formatter->getCustomAddFields(), (array) $apiAccess['view']));
         if ($formatter->getCustomFields()) {
             $formatter->setCustomFields(array_intersect((array) $formatter->getCustomFields(), (array) $apiAccess['view']));
         } else {
             $formatter->setCustomFields((array) $apiAccess['view']);
         }
         if ($formatter->getCustomRelations()) {
             $formatter->setCustomRelations(array_intersect((array) $formatter->getCustomRelations(), (array) $apiAccess['view']));
         } else {
             $formatter->setCustomRelations((array) $apiAccess['view']);
         }
     }
     // set relation depth
     $relationDepth = $this->request->getVar('relationdepth');
     if (is_numeric($relationDepth)) {
         $formatter->relationDepth = (int) $relationDepth;
     }
     return $formatter;
 }