docs: function buildValidatorFunction(f, fnInfo, negate) {	// this does not matter here
  	negate = _.isNil(negate) ? false : negate == true;
  
  	var res = function deferredValidator() {	// this is the Valichain instance
  		log('At deferredValidator():', fnInfo);
  		var args = arguments;
  
  		var fn = function actualValidator() { // this is the Valichain instance
  			log('At actualValidator():', fnInfo, ' / input', this.value);
  			if (!this.validating()) return this;	// stop validating
  
  			var result = (fnInfo.context === null) ?
  			             f.apply(this.value, args) :	  // works for String's functions
  			             f.bind(fnInfo.context, this.value).apply(fnInfo.context, args);
  			if (negate) result = !result;
  
  			if (!result) {
  				this.fail = fnInfo.newName;
  				this.valid = false;
  				if (!_.isNil(this.messages)) this.what = this.messages[this.chain.length];
  			}
  			else {
  				this.chain.push(fnInfo.newName);
  				this.valid = true;
  			}
  		};
  		fn.info = fnInfo;	// helps debugging
  
  		if (_.isUndefined(this.input)) this.deferred.push(fn);
  		else fn.call(this);
  
  		return this;
  	};
  	res.info = fnInfo;
  
  	return res;
  }