code: function parseFile(file, done) {
  
      // create stream
      var saxStream = sax.createStream(options.strict, options);
  
      saxStream.on('error', function(e) {
        // unhandled errors will throw, since this is a proper node
        // event emitter.
        console.error('error!', e);
        // clear the error
        this._parser.error = null;
        this._parser.resume();
  
        // TODO: send to error callback
      });
  
      saxStream.on('opentag', function(node) {
        var name = node.name,
            value;
  
        if (parsedTags.indexOf(name) !== -1) {
          var parser = parsers[name];
  
          if (!parser) {
            throw new Error('[modelgen] no parser for tag <' + name + '>');
          }
  
          value = parser(node, this);
        }
  
        if (value) {
          stack.push(value);
        }
      });
  
      saxStream.on('closetag', function(nodeName) {
        if (parsedTags.indexOf(nodeName) !== -1) {
          stack.pop();
        }
      });
  
      saxStream.on('end', function() {
  
        var result = { byId: elementsById, byType: elementsByType };
  
        postProcess(result);
        done(null, result);
      });
  
      // pipe is supported, and it's readable/writable
      // same chunks coming in also go out.
      fs.createReadStream(file).pipe(saxStream);
    }
docs: Parse a file (i.e. file name) and build the model.
  
  @param  {String}   file the file to parse
  @param  {Function} done the callback function invoked with (err, result)