code: function(files, config, catalog, env) {
  		var grunt = env.grunt;
  		var that = this;
  
  		files.forEach(function(f) {
  			var file = utils.fileInfo(f.dest, config);
  			grunt.log.write('Processing ' + file.catalogPath.cyan);
  			var src = f.src.map(function(src) {
  				return utils.fileInfo(src, {cwd: config.srcWebroot});
  			});
  
  			file.content = src.map(function(src) {
  				return that.processFile(src, config, catalog, env).content;
  			}).join('');
  			
  			if (
  				!config.force 
  				&& file.catalogPath in catalog 
  				&& catalog[file.catalogPath].hash === file.hash 
  				&& fs.existsSync(file.absPath)) {
  					grunt.log.writeln(' [skip]'.grey);
  					return;
  			}
  
  			// save result
  			grunt.log.writeln(' [save]'.green);
  			grunt.file.write(file.absPath, file.content);
  			catalog[file.catalogPath] = {
  				hash: file.hash,
  				date: utils.timestamp(),
  				versioned: file.versionedUrl(config),
  				files: src.map(function(f) {
  					return {
  						file: f.catalogPath,
  						hash: f.hash,
  						versioned: f.versionedUrl(config)
  					};
  				})
  			};
  		});
  	}
docs: Processes given CSS files
  @param  {Array} files    Normalized Grunt task file list
  @param  {Object} config  Current task config
  @param  {Object} catalog Output catalog
  @param  {Object} env     Task environment (`grunt` and `task` properties)
  @return {Object}         Updated catalog