code: function FSWatcher() {
    EventEmitter.call(this);
    const self = this;
    let recursive = false;
    let recursivePathPrefix;
    let filename;
  
    function onchange(path) {
      // Watch for exact filename, or parent path when recursive is true.
      if(filename === path || (recursive && path.indexOf(recursivePathPrefix) === 0)) {
        self.trigger('change', 'change', path);
      }
    }
  
    // We support, but ignore the second arg, which node.js uses.
    self.start = function(filename_, persistent_, recursive_) {
      // Bail if we've already started (and therefore have a filename);
      if(filename) {
        return;
      }
  
      if(Path.isNull(filename_)) {
        throw new Error('Path must be a string without null bytes.');
      }
  
      // TODO: get realpath for symlinks on filename...
  
      // Filer's Path.normalize strips trailing slashes, which we use here.
      // See https://github.com/js-platform/filer/issues/105
      filename = Path.normalize(filename_);
  
      // Whether to watch beneath this path or not
      recursive = recursive_ === true;
      // If recursive, construct a path prefix portion for comparisons later
      // (i.e., '/path' becomes '/path/' so we can search within a filename for the
      // prefix). We also take care to allow for '/' on its own.
      if(recursive) {
        recursivePathPrefix = filename === '/' ? '/' : filename + '/';
      }
  
      const intercom = Intercom.getInstance();
      intercom.on('change', onchange);
    };
  
    self.close = function() {
      const intercom = Intercom.getInstance();
      intercom.off('change', onchange);
      self.removeAllListeners('change');
    };
  }
docs: FSWatcher based on node.js' FSWatcher
  see https://github.com/joyent/node/blob/master/lib/fs.js