async _process(options, beforeHook, process, afterHook) {
    let intoDir = options.target;

    let locals = await this._locals(options);

    // run beforeInstall/beforeUninstall userland hooks
    await beforeHook.call(this, options, locals);

    // gather fileInfos to be processed
    let fileInfos = await process.call(this, intoDir, locals, options);

    // commit changes for each FileInfo (with prompting as needed)
    await Promise.all(fileInfos.map((info) => this._commit(info)));

    // run afterInstall/afterUninstall userland hooks
    await afterHook.call(this, options);
  }
@private
    @method _process
    @param {Object} options
    @param {Function} beforeHook
    @param {Function} process
    @param {Function} afterHook