code: def _call_func(self):
          
          if _CACHING and self.cache and self.name in _TABLE_CACHE:
              logger.debug('returning table {!r} from cache'.format(self.name))
              return _TABLE_CACHE[self.name].value
  
          with log_start_finish(
                  'call function to get frame for table {!r}'.format(
                      self.name),
                  logger):
              kwargs = _collect_variables(names=self._argspec.args,
                                          expressions=self._argspec.defaults)
              frame = self._func(**kwargs)
  
          self._columns = list(frame.columns)
          self._index = frame.index
          self._len = len(frame)
  
          wrapped = DataFrameWrapper(self.name, frame, copy_col=self.copy_col)
  
          if self.cache:
              _TABLE_CACHE[self.name] = CacheItem(
                  self.name, wrapped, self.cache_scope)
  
          return wrapped
docs: Call the wrapped function and return the result wrapped by
          DataFrameWrapper.
          Also updates attributes like columns, index, and length.