docs: function distributed_task(taskDef) {
  	var worker = this[0], taskId = this[1], taskDef2;
  
  	function replace_task_self(obj) {
  		if (typeof(obj) == 'object') {
  			for (var key in obj) {
  				var value = obj[key];
  				if (isDistributedTask(value) && (value.map === worker.TASK_SELF)) {
  					value.map = taskId
  				}
  				else if (value instanceof Array) {
  					value.forEach(replace_task_self)
  				}
  				else replace_task_self(value)
  			}
  		}
  	}
  
  	try {
  		taskDef2 = def.decode(taskDef)
  	}
  	catch (e) {
  		return worker.default_rejected({action: 'taskDef:decode', reason: e, task: taskId})
  			.then(reject_me.bind("decode exception '" + e.message + "'for downloaded " + taskId));
  	}
  
  	// define taskDef.taskId
  	Object.defineProperty(taskDef2, "taskId",
  		{ "value": taskId, "enumerable": false, "writable": false, "configurable": false });
  
  	// replace TASK_SELF in task.map only, with task.run.arguments.map
  	replace_task_self(taskDef2);
  
  	// call taskDef.distributed
  	if ('distributed' in taskDef2) {
  		try {
  			taskDef2.distributed.call(worker, taskDef2)
  		}
  		catch (e) {
  			return worker.default_rejected({action: 'taskDef:distributed', reason: e, task: taskId})
  				.then(reject_me.bind("distributed method exception '" + e.message + "'in " + taskId));
  		}
  	}
  
  	return taskDef2
  }