docs: function copyRecursiveSync(src, dest, dirExp, fileExp) {
  	var stats = {
  		dirCopiedCount : 0,
  		dirSkips : [],
  		fileCopiedCount : 0,
  		fileSkips : [],
  		toString : function() {
  			return this.dirCopiedCount + ' directories/' + this.fileCopiedCount + ' files copied'
  					+ (this.dirSkips.length > 0 ? ' Skipped directories: ' + this.dirSkips.join(',') : '')
  					+ (this.fileSkips.length > 0 ? ' Skipped files: ' + this.fileSkips.join(',') : '');
  		}
  	};
  	crs(stats, src, dest, dirExp, fileExp);
  	return stats;
  	function safeStatsSync(s) {
  		var r = {};
  		r.exists = fs.existsSync(s);
  		r.stats = r.exists && fs.statSync(s);
  		r.isDir = r.exists && r.stats.isDirectory();
  		return r;
  	}
  	function crs(s, src, dest, dirExp, fileExp) {
  		var srcStats = safeStatsSync(src);
  		if (srcStats.exists && srcStats.isDir) {
  			if (dirExp && util.isRegExp(dirExp) && dirExp.test(src)) {
  				s.dirSkips.push(src);
  				return;
  			}
  			var destStats = safeStatsSync(dest);
  			if (!destStats.exists) {
  				fs.mkdirSync(dest);
  			}
  			s.dirCopiedCount++;
  			fs.readdirSync(src).forEach(function(name) {
  				crs(s, path.join(src, name), path.join(dest, name));
  			});
  		} else {
  			if (fileExp && util.isRegExp(fileExp) && fileExp.test(src)) {
  				s.fileSkips.push(src);
  				return;
  			}
  			fs.linkSync(src, dest);
  			s.fileCopiedCount++;
  			// console.log('Copied "' + src + '" to "' + dest + '"');
  		}
  	}
  }