code: function (opts) {
  
  	// minimal error checking
  	if (!_.isObject(opts)) {
  		opts.silenceError || opts === 'silenceErrorJustForTests' || console.error('an opts obj must be passed to main constructor', opts);
  		throw new Error({message: 'an opts obj must be passed to main constructor: ' + opts});
  	}
  
  	if (!_.isArray(opts.assets)) {
  		opts.silenceError || console.error('files array is missing', opts);
  		throw new Error({message: 'files array is missing: ' + opts.assets});
  
  	} else {
  
  		if (_.isFunction(opts.cb)) this.cb = opts.cb;
  
  		this.silence = opts.silence;
  		this.assets = opts.assets;
  		this.requireJs = opts.requireJs; // remove js suffix when replacing text in these files
  		this.keepOriginalAndOldVersions = opts.keepOriginalAndOldVersions;
  		this.keepOriginal = opts.keepOriginal;
  		this.keepOldVersions = opts.keepOldVersions;
  		this.cdnPath = opts.cdnPath;
  
  		// Find and replace references to assets in the list of files in the grep array //
  		var grepFiles = (opts.grepFiles && _.isArray(opts.grepFiles)) ? opts.grepFiles : [];
  
  		// Allow globbed file paths to be passed into grepFiles option.
  	    this.grepFiles = grepFiles.reduce(function appendGlobbedFiles(files, currentFile) {
  			return files.concat(glob.sync(currentFile));
  	    }, []);
  
  		this.baseOpts = {
  			newVersion: opts.newVersion,
  			assets: this.assets,
  			keepOriginalAndOldVersions: this.keepOriginalAndOldVersions,
  			keepOriginal: this.keepOriginal,
  			keepOldVersions: this.keepOldVersions,
  			requireJs: this.requireJs,
  			cdnPath: this.cdnPath
  		};
  
  		return _(this).bindAll('run', 'initReplacers', 'checkPaths', 'grepFilesReplace', 'renameAssetsInFilesystem', 'deleteOldAssetsInFilesystem');
  	}
  }
docs: Class