code: function createValueOperator(vault, value) {
  	// figure out what operation we should be doing for this vault
  
  	var operation = value.getOperationForVault(vault);
  	if (!operation) {
  		return;
  	}
  
  	// check if this value can be stored in this vault, by pulling out the API for this topic
  
  	var topicApi = configuration.getTopicApi(value.topic, vault.name);
  	if (!topicApi) {
  		logger.verbose('No topic API for topic', value.topic, 'on vault', vault.name);
  		return;
  	}
  
  	// get the function that will execute this operation on this vault
  
  	if (typeof vault.archive[operation] !== 'function') {
  		throw new Error('Operation ' + operation + ' not supported on vault ' + vault.name);
  	}
  
  	// create a function that will execute this operation
  
  	return function (cb) {
  		logger.verbose('Running operation', operation, 'for topic', value.topic, 'on vault', vault.name);
  
  		// errors are passed into the 2nd argument of the callback, because mutation operations are best-effort, and an
  		// error case should never prevent other mutations from happening.
  
  		try {
  			var startTime = process.hrtime();
  
  			vault.archive[operation](topicApi, value, function (error) {
  				if (error) {
  					var context = {
  						index: value.index,
  						operation: operation,
  						topic: value.topic,
  						vault: vault.name
  					};
  
  					logger.alert.data(context).log(error);
  
  					exports.emit('vaultError', vault.name, operation);
  				} else {
  					exports.emit('operation', vault.name, operation, process.hrtime(startTime));
  				}
  
  				cb(null, error);
  			});
  		} catch (error) {
  			var context = {
  				index: value.index,
  				operation: operation,
  				topic: value.topic,
  				vault: vault.name
  			};
  
  			logger.alert.data(context).log(error);
  
  			setImmediate(cb, null, error);
  		}
  	};
  }
docs: distributing mutations ----------------------