code: def call(method, path, ret_type,
      ret_is_list=False, data=None, params=None, api_version=1):
    
    check_api_version(method.im_self, api_version)
    if data is not None:
      data = json.dumps(Attr(is_api_list=True).to_json(data, False))
      ret = method(path, data=data, params=params)
    else:
      ret = method(path, params=params)
    if ret_type is None:
      return
    elif ret_is_list:
      return ApiList.from_json_dict(ret, method.im_self, ret_type)
    elif isinstance(ret, list):
      return [ ret_type.from_json_dict(x, method.im_self) for x in ret ]
    else:
      return ret_type.from_json_dict(ret, method.im_self)
docs: Generic function for calling a resource method and automatically dealing with
    serialization of parameters and deserialization of return values.
  
    @param method: method to call (must be bound to a resource;
                   e.g., "resource_root.get").
    @param path: the full path of the API method to call.
    @param ret_type: return type of the call.
    @param ret_is_list: whether the return type is an ApiList.
    @param data: Optional data to send as payload to the call.
    @param params: Optional query parameters for the call.
    @param api_version: minimum API version for the call.