/**
  * Fetch the data object that determines the group round matchups / fixtures and results directly
  * 
  * @return BBGroupsObject|boolean
  * Returns false if tournament has no groups to draw
  */
 public function &groups()
 {
     //Already set
     if (!is_null($this->brackets)) {
         return $this->brackets;
     }
     //Failure
     if (!BBHelper::tournament_has_group_rounds($this)) {
         $this->set_error('This tournament does not have any groups to load!');
         return $this->bb->ref(false);
     }
     //GOGOGO!
     $result = $this->call(self::SERVICE_LOAD_GROUPS, array('tourney_id' => $this->id), self::CACHE_TTL_DRAW, self::CACHE_OBJECT_TYPE, $this->id);
     //Failure!
     if ($result->result != BinaryBeast::RESULT_SUCCESS) {
         $this->set_error('Error returned from the API when calling the bracket drawing service, please refer to $bb->result_history for details');
         return $this->bb->ref(false);
     }
     /*
      * Success!
      * 
      * Now pass each returned match through process_draw_match,
      * which will attempt to convert the values into Model objects,
      * save the result in brackets, keyed by the group label
      */
     $this->groups = new stdClass();
     foreach ($result->fixtures as $group => $rounds) {
         $group = strtolower($group);
         $this->groups->{$group} = array();
         foreach ($rounds as $round => $matches) {
             $this->groups->{$group}[$round] = array();
             foreach ($matches as $match) {
                 $this->groups->{$group}[$round][] = $this->process_drawn_match($match);
             }
         }
     }
     //Success! now return the result
     return $this->groups;
 }