docs: function(next) {
            var wait = 0;
            function _exec() {
              if(writtingFiles[dest]) {
                // Try leater
                grunt.verbose.writeln('  ... wait for %s before writing (%s)', dest, wait++);
                return setImmediate(_exec);
              }
              writtingFiles[dest] = true;
  
              var trans = [], transStream = through2();
              tally.concats++;
  
              // Each transform builder is called and combined in
              // one readable/writable stream using stream-combiner
              if(transformsConcat && transformsConcat.length) {
                trans = _(transformsConcat)
                // Call each tranform stream builder
                .map(function(f) {
                  return f(sources, dest, _.extend({}, options));
                })
                // Keep only stream (ignore anything without a pipe() method)
                .filter(function(s) { return s && s.pipe; });
                transStream = bun(trans);
              }
  
              var mainStream    = new StreamStream({separator: ''});
              var bodyStream    = new StreamStream({separator: separator});
              var writeStream   = fs.createWriteStream(dest, {mode: mode});
  
              // Concat each sources
              sources.forEach(function(src) {
                if(!statSources[src].size) {
                  return;
                }
                bodyStream.write(fs.createReadStream(src));
              });
              bodyStream.end();
  
  
              grunt.verbose.writeln(
                '  read([%s]) -> transform(count:%s) -> write(%s)',
                sources.join(',').blue,
                trans.length.toString().blue,
                dest.blue
              );
  
              // Pipe all together
              if(banner) {
                mainStream.write(strToStream(banner));
              }
  
              mainStream.write(bun([bodyStream, transStream]));
  
              if(footer) {
                mainStream.write(strToStream(footer));
              }
  
              mainStream.end();
  
              // Write out
              mainStream.pipe(writeStream);
  
              mainStream.on('error', function(error) {
                grunt.fail.fatal(error);
              });
  
              writeStream.once('finish', function() {
                writtingFiles[dest] = false;
                next();
              });
            }
            _exec();
          }