docs: function generateResourcesHandlingFunctions(resourcesDescriptionList, config){
  	const resourcesHandlingFunctions = {};
  	Object.keys(resourcesDescriptionList).forEach((resourceName) => {
  			const resourceDescription = resourcesDescriptionList[resourceName];
  			const resourceCategory = resourceDescription.category;
  
  			resourcesHandlingFunctions[resourceName] = function(userOpts, userCb) {
  				//create default request object
  				const requestOpts = createDefaultRequestOptObject(resourceDescription);
  
  				//prepare requestOpts based on userOpts, config, etc.
  				updateRequestOptsFnList.forEach(
  					(updateRequestOptsFn) => updateRequestOptsFn(requestOpts, resourceDescription, userOpts, config)
  				);
  
  				const callback = prepareCallback(userCb);
  
  				//send request
  				if (resourceCategory === UPLOAD_RESOURCE_CATEGORY) {
  					//it's upload type request, so pipe
  					if(userOpts.readStream){
  						// read stream specified, so pipe it
  						return userOpts.readStream.pipe(request(requestOpts, callback));
  					}else {
  						// readStream not specified, so return writable stream
  						return request(requestOpts, callback);
  					}
  				}else if(resourceCategory === DOWNLOAD_RESOURCE_CATEGORY) {
  					return request(requestOpts, callback).pipe(createTransformStream());
  				}else {
  					//ordinary api call request
  					return request(requestOpts, callback);
  				}
  
  				function prepareCallback(userCb) {
  					return (err, response, body) => {
  						if (err) {
  							return userCb(err, null, response);
  						}
  
  						const responseContentType = response.headers['content-type'];
  						const statusCode = response.statusCode;
  
  						const handleResponseByContentType = {
  							/* it's content-stream response type, so response object is located inside header */
  							'application/octet-stream': () => {
  								const dropboxApiResultContent = response.headers[DB_API_RESULT_HEADER_NAME];
  								return dropboxApiResultContent && userCb(null, JSON.parse(dropboxApiResultContent), response);
  							},
  							/* it's ordinary RPC response, so result object is located inside body */
  							'application/json': () => {
  								const json = body;
  								if(statusCode === 200) {
  									return userCb(null, json, response);
  								}else {
  									json.code = statusCode;
  									return userCb(json, null, response);
  								}
  							},
  							/* text type response */
  							'text/plain; charset=utf-8': () => {
  								const text = body;
  								if(statusCode === 200) {
  									return userCb(null, text, response);
  								}else{
  									return userCb({
  										code: statusCode,
  										text: text
  									}, null, response);
  								}
  							}
  						};
  
  						const responseHandlerFn = handleResponseByContentType[responseContentType];
  						if (responseHandlerFn) {
  							responseHandlerFn();
  						}else {
  							userCb(err || {});
  						}
  				}
  			}
  			};
  	});
  	return resourcesHandlingFunctions;
  }