diff --git a/bin/dartdoc.dart b/bin/dartdoc.dart
index fa2d136..917ee03 100644
--- a/bin/dartdoc.dart
+++ b/bin/dartdoc.dart
@@ -5,134 +5,27 @@
 library dartdoc.bin;
 
 import 'dart:async';
-import 'dart:io';
 
-import 'package:args/args.dart';
 import 'package:dartdoc/dartdoc.dart';
-import 'package:dartdoc/src/logging.dart';
-import 'package:dartdoc/src/tool_runner.dart';
-import 'package:stack_trace/stack_trace.dart';
-
-class DartdocProgramOptionContext extends DartdocGeneratorOptionContext
-    with LoggingContext {
-  DartdocProgramOptionContext(DartdocOptionSet optionSet, Directory dir)
-      : super(optionSet, dir);
-
-  bool get asyncStackTraces => optionSet['asyncStackTraces'].valueAt(context);
-  bool get generateDocs => optionSet['generateDocs'].valueAt(context);
-  bool get help => optionSet['help'].valueAt(context);
-  bool get version => optionSet['version'].valueAt(context);
-}
-
-Future<List<DartdocOption>> createDartdocProgramOptions() async {
-  return <DartdocOption>[
-    DartdocOptionArgOnly<bool>('asyncStackTraces', false,
-        help: 'Display coordinated asynchronous stack traces (slow)',
-        negatable: true),
-    DartdocOptionArgOnly<bool>('generateDocs', true,
-        help:
-            'Generate docs into the output directory (or only display warnings if false).',
-        negatable: true),
-    DartdocOptionArgOnly<bool>('help', false,
-        abbr: 'h', help: 'Show command help.', negatable: false),
-    DartdocOptionArgOnly<bool>('version', false,
-        help: 'Display the version for $programName.', negatable: false),
-  ];
-}
+import 'package:dartdoc/options.dart';
 
 /// Analyzes Dart files and generates a representation of included libraries,
 /// classes, and members. Uses the current directory to look for libraries.
 Future<void> main(List<String> arguments) async {
-  var optionSet = await DartdocOptionSet.fromOptionGenerators('dartdoc', [
-    createDartdocOptions,
-    createDartdocProgramOptions,
-    createLoggingOptions,
-    createGeneratorOptions,
-  ]);
-
-  try {
-    optionSet.parseArguments(arguments);
-  } on FormatException catch (e) {
-    stderr.writeln(' fatal error: ${e.message}');
-    stderr.writeln('');
-    _printUsage(optionSet.argParser);
-    // Do not use exit() as this bypasses --pause-isolates-on-exit
-    // TODO(jcollins-g): use exit once dart-lang/sdk#31747 is fixed.
-    exitCode = 64;
+  var config = await parseOptions(arguments);
+  if (config == null) {
+    // There was an error while parsing options.
     return;
   }
-  if (optionSet['help'].valueAt(Directory.current)) {
-    _printHelp(optionSet.argParser);
-    exitCode = 0;
-    return;
-  }
-  if (optionSet['version'].valueAt(Directory.current)) {
-    _printVersion(optionSet.argParser);
-    exitCode = 0;
-    return;
-  }
-
-  DartdocProgramOptionContext config;
-  try {
-    config = DartdocProgramOptionContext(optionSet, null);
-  } on DartdocOptionError catch (e) {
-    stderr.writeln(' fatal error: ${e.message}');
-    stderr.writeln('');
-    await stderr.flush();
-    _printUsage(optionSet.argParser);
-    exitCode = 64;
-    return;
-  }
-  startLogging(config);
-
-  var dartdoc = config.generateDocs
-      ? await Dartdoc.fromContext(config)
-      : await Dartdoc.withEmptyGenerator(config);
-  dartdoc.onCheckProgress.listen(logProgress);
-  try {
-    await Chain.capture(() async {
-      await runZoned(dartdoc.generateDocs,
-          zoneSpecification: ZoneSpecification(
-              print: (Zone self, ZoneDelegate parent, Zone zone, String line) =>
-                  logPrint(line)));
-    }, onError: (e, Chain chain) {
-      if (e is DartdocFailure) {
-        stderr.writeln('\ndartdoc failed: ${e}.');
-        if (config.verboseWarnings) {
-          stderr.writeln(chain.terse);
-        }
-        exitCode = 1;
-        return;
-      } else {
-        stderr.writeln('\ndartdoc failed: ${e}\n${chain.terse}');
-        exitCode = 255;
-        return;
-      }
-    }, when: config.asyncStackTraces);
-  } finally {
-    // Clear out any cached tool snapshots and temporary directories.
-    // ignore: unawaited_futures
-    SnapshotCache.instance.dispose();
-    // ignore: unawaited_futures
-    ToolTempFileTracker.instance.dispose();
-  }
-  exitCode = 0;
-  return;
-}
-
-/// Print help if we are passed the help option.
-void _printHelp(ArgParser parser) {
-  print('Generate HTML documentation for Dart libraries.\n');
-  print(parser.usage);
-}
-
-/// Print usage information on invalid command lines.
-void _printUsage(ArgParser parser) {
-  print('Usage: dartdoc [OPTIONS]\n');
-  print(parser.usage);
-}
-
-/// Print version information.
-void _printVersion(ArgParser parser) {
-  print('dartdoc version: ${dartdocVersion}');
+  // Set the default way to construct [PackageMeta].
+  PackageMeta.setPackageMetaFactories(
+    PubPackageMeta.fromElement,
+    PubPackageMeta.fromFilename,
+    PubPackageMeta.fromDir,
+  );
+  final packageBuilder = PubPackageBuilder(config);
+  final dartdoc = config.generateDocs
+      ? await Dartdoc.fromContext(config, packageBuilder)
+      : await Dartdoc.withEmptyGenerator(config, packageBuilder);
+  dartdoc.executeGuarded();
 }
diff --git a/lib/dartdoc.dart b/lib/dartdoc.dart
index 4b7345b..c1cac90 100644
--- a/lib/dartdoc.dart
+++ b/lib/dartdoc.dart
@@ -20,6 +20,7 @@
 import 'package:dartdoc/src/logging.dart';
 import 'package:dartdoc/src/model/model.dart';
 import 'package:dartdoc/src/package_meta.dart';
+import 'package:dartdoc/src/tool_runner.dart';
 import 'package:dartdoc/src/tuple.dart';
 import 'package:dartdoc/src/utils.dart';
 import 'package:dartdoc/src/version.dart';
@@ -94,8 +95,10 @@
 
 /// Generates Dart documentation for all public Dart libraries in the given
 /// directory.
-class Dartdoc extends PackageBuilder {
+class Dartdoc {
   final Generator generator;
+  final PackageBuilder packageBuilder;
+  final DartdocOptionContext config;
   final Set<String> writtenFiles = {};
   Directory outputDir;
 
@@ -103,7 +106,7 @@
   final StreamController<String> _onCheckProgress =
       StreamController(sync: true);
 
-  Dartdoc._(DartdocOptionContext config, this.generator) : super(config) {
+  Dartdoc._(this.config, this.generator, this.packageBuilder) {
     outputDir = Directory(config.output)..createSync(recursive: true);
   }
 
@@ -111,19 +114,34 @@
   /// and returns a Dartdoc object with them.
   @Deprecated('Prefer fromContext() instead')
   static Future<Dartdoc> withDefaultGenerators(
-      DartdocGeneratorOptionContext config) async {
-    return Dartdoc._(config, await initHtmlGenerator(config));
+    DartdocGeneratorOptionContext config,
+    PackageBuilder packageBuilder,
+  ) async {
+    return Dartdoc._(
+      config,
+      await initHtmlGenerator(config),
+      packageBuilder,
+    );
   }
 
   /// Asynchronous factory method that builds Dartdoc with an empty generator.
-  static Future<Dartdoc> withEmptyGenerator(DartdocOptionContext config) async {
-    return Dartdoc._(config, await initEmptyGenerator(config));
+  static Future<Dartdoc> withEmptyGenerator(
+    DartdocOptionContext config,
+    PackageBuilder packageBuilder,
+  ) async {
+    return Dartdoc._(
+      config,
+      await initEmptyGenerator(config),
+      packageBuilder,
+    );
   }
 
   /// Asynchronous factory method that builds Dartdoc with a generator
   /// determined by the given context.
   static Future<Dartdoc> fromContext(
-      DartdocGeneratorOptionContext context) async {
+    DartdocGeneratorOptionContext context,
+    PackageBuilder packageBuilder,
+  ) async {
     Generator generator;
     switch (context.format) {
       case 'html':
@@ -135,7 +153,11 @@
       default:
         throw DartdocFailure('Unsupported output format: ${context.format}');
     }
-    return Dartdoc._(context, generator);
+    return Dartdoc._(
+      context,
+      generator,
+      packageBuilder,
+    );
   }
 
   Stream<String> get onCheckProgress => _onCheckProgress.stream;
@@ -150,7 +172,7 @@
   Future<DartdocResults> generateDocsBase() async {
     var _stopwatch = Stopwatch()..start();
     double seconds;
-    packageGraph = await buildPackageGraph();
+    packageGraph = await packageBuilder.buildPackageGraph();
     seconds = _stopwatch.elapsedMilliseconds / 1000.0;
     var libs = packageGraph.libraries.length;
     logInfo("Initialized dartdoc with ${libs} librar${libs == 1 ? 'y' : 'ies'} "
@@ -188,22 +210,31 @@
   }
 
   Future<DartdocResults> generateDocs() async {
-    logInfo('Documenting ${config.topLevelPackageMeta}...');
+    try {
+      logInfo('Documenting ${config.topLevelPackageMeta}...');
 
-    var dartdocResults = await generateDocsBase();
-    if (dartdocResults.packageGraph.localPublicLibraries.isEmpty) {
-      throw DartdocFailure('dartdoc could not find any libraries to document');
-    }
+      var dartdocResults = await generateDocsBase();
+      if (dartdocResults.packageGraph.localPublicLibraries.isEmpty) {
+        throw DartdocFailure(
+            'dartdoc could not find any libraries to document');
+      }
 
-    final errorCount =
-        dartdocResults.packageGraph.packageWarningCounter.errorCount;
-    if (errorCount > 0) {
-      throw DartdocFailure(
-          'dartdoc encountered $errorCount errors while processing.');
+      final errorCount =
+          dartdocResults.packageGraph.packageWarningCounter.errorCount;
+      if (errorCount > 0) {
+        throw DartdocFailure(
+            'dartdoc encountered $errorCount errors while processing.');
+      }
+      logInfo(
+          'Success! Docs generated into ${dartdocResults.outDir.absolute.path}');
+      return dartdocResults;
+    } finally {
+      // Clear out any cached tool snapshots and temporary directories.
+      // ignore: unawaited_futures
+      SnapshotCache.instance.dispose();
+      // ignore: unawaited_futures
+      ToolTempFileTracker.instance.dispose();
     }
-    logInfo(
-        'Success! Docs generated into ${dartdocResults.outDir.absolute.path}');
-    return dartdocResults;
   }
 
   /// Warn on file paths.
@@ -429,6 +460,37 @@
     _doOrphanCheck(packageGraph, origin, visited);
     _doSearchIndexCheck(packageGraph, origin, visited);
   }
+
+  /// Runs [generateDocs] function and properly handles the errors.
+  void executeGuarded() {
+    onCheckProgress.listen(logProgress);
+    // This function should *never* await `runZonedGuarded` because the errors
+    // thrown in generateDocs are uncaught. We want this because uncaught errors
+    // cause IDE debugger to automatically stop at the exception.
+    //
+    // If you await the zone, the code that comes after the await is not
+    // executed if the zone dies due to uncaught error. To avoid this confusion,
+    // never await `runZonedGuarded` and never change the return value of
+    // [executeGuarded].
+    runZonedGuarded(
+      generateDocs,
+      (e, chain) {
+        if (e is DartdocFailure) {
+          stderr.writeln('\ndartdoc failed: ${e}.');
+          if (config.verboseWarnings) {
+            stderr.writeln(chain);
+          }
+          exitCode = 1;
+        } else {
+          stderr.writeln('\ndartdoc failed: ${e}\n${chain}');
+          exitCode = 255;
+        }
+      },
+      zoneSpecification: ZoneSpecification(
+        print: (_, __, ___, String line) => logPrint(line),
+      ),
+    );
+  }
 }
 
 /// This class is returned if dartdoc fails in an expected way (for instance, if
diff --git a/lib/options.dart b/lib/options.dart
new file mode 100644
index 0000000..9383a6e
--- /dev/null
+++ b/lib/options.dart
@@ -0,0 +1,90 @@
+import 'dart:async';
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:dartdoc/dartdoc.dart';
+import 'package:dartdoc/src/logging.dart';
+
+class DartdocProgramOptionContext extends DartdocGeneratorOptionContext
+    with LoggingContext {
+  DartdocProgramOptionContext(DartdocOptionSet optionSet, Directory dir)
+      : super(optionSet, dir);
+
+  bool get generateDocs => optionSet['generateDocs'].valueAt(context);
+  bool get help => optionSet['help'].valueAt(context);
+  bool get version => optionSet['version'].valueAt(context);
+}
+
+Future<List<DartdocOption>> createDartdocProgramOptions() async {
+  return <DartdocOption>[
+    DartdocOptionArgOnly<bool>('generateDocs', true,
+        help:
+            'Generate docs into the output directory (or only display warnings if false).',
+        negatable: true),
+    DartdocOptionArgOnly<bool>('help', false,
+        abbr: 'h', help: 'Show command help.', negatable: false),
+    DartdocOptionArgOnly<bool>('version', false,
+        help: 'Display the version for $programName.', negatable: false),
+  ];
+}
+
+Future<DartdocProgramOptionContext> parseOptions(List<String> arguments) async {
+  var optionSet = await DartdocOptionSet.fromOptionGenerators('dartdoc', [
+    createDartdocOptions,
+    createDartdocProgramOptions,
+    createLoggingOptions,
+    createGeneratorOptions,
+  ]);
+
+  try {
+    optionSet.parseArguments(arguments);
+  } on FormatException catch (e) {
+    stderr.writeln(' fatal error: ${e.message}');
+    stderr.writeln('');
+    _printUsage(optionSet.argParser);
+    // Do not use exit() as this bypasses --pause-isolates-on-exit
+    exitCode = 64;
+    return null;
+  }
+  if (optionSet['help'].valueAt(Directory.current)) {
+    _printHelp(optionSet.argParser);
+    exitCode = 0;
+    return null;
+  }
+  if (optionSet['version'].valueAt(Directory.current)) {
+    _printVersion(optionSet.argParser);
+    exitCode = 0;
+    return null;
+  }
+
+  DartdocProgramOptionContext config;
+  try {
+    config = DartdocProgramOptionContext(optionSet, null);
+  } on DartdocOptionError catch (e) {
+    stderr.writeln(' fatal error: ${e.message}');
+    stderr.writeln('');
+    await stderr.flush();
+    _printUsage(optionSet.argParser);
+    exitCode = 64;
+    return null;
+  }
+  startLogging(config);
+  return config;
+}
+
+/// Print help if we are passed the help option.
+void _printHelp(ArgParser parser) {
+  print('Generate HTML documentation for Dart libraries.\n');
+  print(parser.usage);
+}
+
+/// Print usage information on invalid command lines.
+void _printUsage(ArgParser parser) {
+  print('Usage: dartdoc [OPTIONS]\n');
+  print(parser.usage);
+}
+
+/// Print version information.
+void _printVersion(ArgParser parser) {
+  print('dartdoc version: ${dartdocVersion}');
+}
diff --git a/lib/src/model/package_builder.dart b/lib/src/model/package_builder.dart
index ee0a67b..12466ea 100644
--- a/lib/src/model/package_builder.dart
+++ b/lib/src/model/package_builder.dart
@@ -34,11 +34,18 @@
 import 'package:quiver/iterables.dart' as quiver;
 
 /// Everything you need to instantiate a PackageGraph object for documenting.
-class PackageBuilder {
+abstract class PackageBuilder {
+  // Builds package graph to be used by documentation generator.
+  Future<PackageGraph> buildPackageGraph();
+}
+
+/// A package builder that understands pub package format.
+class PubPackageBuilder implements PackageBuilder {
   final DartdocOptionContext config;
 
-  PackageBuilder(this.config);
+  PubPackageBuilder(this.config);
 
+  @override
   Future<PackageGraph> buildPackageGraph() async {
     if (!config.sdkDocs) {
       if (config.topLevelPackageMeta.needsPubGet &&
diff --git a/lib/src/package_meta.dart b/lib/src/package_meta.dart
index b51d4b7..d751d8a 100644
--- a/lib/src/package_meta.dart
+++ b/lib/src/package_meta.dart
@@ -19,7 +19,7 @@
 
 Directory get defaultSdkDir {
   var sdkDir = File(Platform.resolvedExecutable).parent.parent;
-  assert(path.equals(sdkDir.path, PackageMeta.sdkDirParent(sdkDir).path));
+  assert(path.equals(sdkDir.path, PubPackageMeta.sdkDirParent(sdkDir).path));
   return sdkDir;
 }
 
@@ -35,11 +35,121 @@
   ['lib/core/core.dart'],
 ];
 
+/// Describes a single package in the context of `dartdoc`.
+///
+/// The primary function of this class is to allow canonicalization of packages
+/// by returning the same [PackageMeta] for a given filename, library or path
+/// if they belong to the same package.
+///
+/// Overriding this is typically done by overriding factories as rest of
+/// `dartdoc` creates this object by calling these static factories.
 abstract class PackageMeta {
   final Directory dir;
 
   PackageMeta(this.dir);
 
+  @override
+  bool operator ==(other) {
+    if (other is! PackageMeta) return false;
+    return path.equals(dir.absolute.path, other.dir.absolute.path);
+  }
+
+  @override
+  int get hashCode => path.hash(dir.absolute.path);
+
+  /// Returns true if this represents a 'Dart' SDK.  A package can be part of
+  /// Dart and Flutter at the same time, but if we are part of a Dart SDK
+  /// sdkType should never return null.
+  bool get isSdk;
+
+  /// Returns 'Dart' or 'Flutter' (preferentially, 'Flutter' when the answer is
+  /// "both"), or null if this package is not part of a SDK.
+  String sdkType(String flutterRootPath);
+
+  bool get needsPubGet => false;
+
+  bool get requiresFlutter;
+
+  void runPubGet(String flutterRoot);
+
+  String get name;
+
+  /// null if not a hosted pub package.  If set, the hostname
+  /// that the package is hosted at -- usually 'pub.dartlang.org'.
+  String get hostedAt;
+
+  String get version;
+
+  String get description;
+
+  String get homepage;
+
+  FileContents getReadmeContents();
+
+  FileContents getLicenseContents();
+
+  FileContents getChangelogContents();
+
+  /// Returns true if we are a valid package, valid enough to generate docs.
+  bool get isValid => getInvalidReasons().isEmpty;
+
+  /// Returns resolved directory.
+  String get resolvedDir;
+
+  /// Returns a list of reasons this package is invalid, or an
+  /// empty list if no reasons found.
+  ///
+  /// If the list is empty, this package is valid.
+  List<String> getInvalidReasons();
+
+  @override
+  String toString() => name;
+
+  /// Sets the supported ways of constructing [PackageMeta] objects.
+  ///
+  /// These objects can be constructed from a filename, a directory
+  /// or a [LibraryElement]. We allow different dartdoc implementations to
+  /// provide their own [PackageMeta] types.
+  ///
+  /// By calling this function, these implementations can control how
+  /// [PackageMeta] is built.
+  static void setPackageMetaFactories(
+    PackageMeta Function(LibraryElement, String) fromElementFactory,
+    PackageMeta Function(String) fromFilenameFactory,
+    PackageMeta Function(Directory) fromDirFactory,
+  ) {
+    assert(fromElementFactory != null);
+    assert(fromFilenameFactory != null);
+    assert(fromDirFactory != null);
+    if (_fromElement == fromElementFactory &&
+        _fromFilename == fromFilenameFactory &&
+        _fromDir == fromDirFactory) {
+      // Nothing to do.
+      return;
+    }
+    if (_fromElement != null || _fromFilename != null || _fromDir != null) {
+      throw StateError('PackageMeta factories cannot be changed once defined.');
+    }
+    _fromElement = fromElementFactory;
+    _fromFilename = fromFilenameFactory;
+    _fromDir = fromDirFactory;
+  }
+
+  static PackageMeta Function(LibraryElement, String) _fromElement;
+  static PackageMeta Function(String) _fromFilename;
+  static PackageMeta Function(Directory) _fromDir;
+  static PackageMeta Function(LibraryElement, String) get fromElement =>
+      _fromElement ?? PubPackageMeta.fromElement;
+  static PackageMeta Function(String) get fromFilename =>
+      _fromFilename ?? PubPackageMeta.fromFilename;
+  static PackageMeta Function(Directory) get fromDir =>
+      _fromDir ?? PubPackageMeta.fromDir;
+}
+
+/// Default implementation of [PackageMeta] depends on pub packages.
+abstract class PubPackageMeta extends PackageMeta {
+  PubPackageMeta(Directory dir) : super(dir);
+
   static List<List<String>> __sdkDirFilePaths;
 
   static List<List<String>> get _sdkDirFilePaths {
@@ -83,34 +193,25 @@
     return _sdkDirParent[dirPathCanonical];
   }
 
-  @override
-  bool operator ==(other) {
-    if (other is! PackageMeta) return false;
-    return path.equals(dir.absolute.path, other.dir.absolute.path);
-  }
-
-  @override
-  int get hashCode => path.hash(dir.absolute.path);
-
   /// Use this instead of fromDir where possible.
-  factory PackageMeta.fromElement(
+  static PubPackageMeta fromElement(
       LibraryElement libraryElement, String sdkDir) {
     if (libraryElement.isInSdk) {
-      return PackageMeta.fromDir(Directory(sdkDir));
+      return PubPackageMeta.fromDir(Directory(sdkDir));
     }
-    return PackageMeta.fromDir(
+    return PubPackageMeta.fromDir(
         File(path.canonicalize(libraryElement.source.fullName)).parent);
   }
 
-  factory PackageMeta.fromFilename(String filename) {
-    return PackageMeta.fromDir(File(filename).parent);
+  static PubPackageMeta fromFilename(String filename) {
+    return PubPackageMeta.fromDir(File(filename).parent);
   }
 
   /// This factory is guaranteed to return the same object for any given
   /// [dir.absolute.path].  Multiple [dir.absolute.path]s will resolve to the
   /// same object if they are part of the same package.  Returns null
   /// if the directory is not part of a known package.
-  factory PackageMeta.fromDir(Directory dir) {
+  static PubPackageMeta fromDir(Directory dir) {
     var original = dir.absolute;
     dir = original;
     if (!original.existsSync()) {
@@ -142,13 +243,7 @@
     return _packageMetaCache[dir.absolute.path];
   }
 
-  /// Returns true if this represents a 'Dart' SDK.  A package can be part of
-  /// Dart and Flutter at the same time, but if we are part of a Dart SDK
-  /// sdkType should never return null.
-  bool get isSdk;
-
-  /// Returns 'Dart' or 'Flutter' (preferentially, 'Flutter' when the answer is
-  /// "both"), or null if this package is not part of a SDK.
+  @override
   String sdkType(String flutterRootPath) {
     if (flutterRootPath != null) {
       var flutterPackages = path.join(flutterRootPath, 'packages');
@@ -166,48 +261,13 @@
     return isSdk ? 'Dart' : null;
   }
 
-  bool get needsPubGet => false;
-
-  bool get requiresFlutter;
-
-  void runPubGet(String flutterRoot);
-
-  String get name;
-
-  /// null if not a hosted pub package.  If set, the hostname
-  /// that the package is hosted at -- usually 'pub.dartlang.org'.
-  String get hostedAt;
-
-  String get version;
-
-  String get description;
-
-  String get homepage;
-
   String _resolvedDir;
 
+  @override
   String get resolvedDir {
     _resolvedDir ??= dir.resolveSymbolicLinksSync();
     return _resolvedDir;
   }
-
-  FileContents getReadmeContents();
-
-  FileContents getLicenseContents();
-
-  FileContents getChangelogContents();
-
-  /// Returns true if we are a valid package, valid enough to generate docs.
-  bool get isValid => getInvalidReasons().isEmpty;
-
-  /// Returns a list of reasons this package is invalid, or an
-  /// empty list if no reasons found.
-  ///
-  /// If the list is empty, this package is valid.
-  List<String> getInvalidReasons();
-
-  @override
-  String toString() => name;
 }
 
 class FileContents {
@@ -225,7 +285,7 @@
   String toString() => file.path;
 }
 
-class _FilePackageMeta extends PackageMeta {
+class _FilePackageMeta extends PubPackageMeta {
   FileContents _readme;
   FileContents _license;
   FileContents _changelog;
@@ -374,7 +434,7 @@
   return null;
 }
 
-class _SdkMeta extends PackageMeta {
+class _SdkMeta extends PubPackageMeta {
   String sdkReadmePath;
 
   _SdkMeta(Directory dir) : super(dir) {
diff --git a/test/dartdoc_test.dart b/test/dartdoc_test.dart
index d1d7ee9..4c4c0f3 100644
--- a/test/dartdoc_test.dart
+++ b/test/dartdoc_test.dart
@@ -45,8 +45,12 @@
 
     Future<Dartdoc> buildDartdoc(
         List<String> argv, Directory packageRoot, Directory tempDir) async {
-      return await Dartdoc.fromContext(await generatorContextFromArgv(argv
-        ..addAll(['--input', packageRoot.path, '--output', tempDir.path])));
+      var context = await generatorContextFromArgv(argv
+        ..addAll(['--input', packageRoot.path, '--output', tempDir.path]));
+      return await Dartdoc.fromContext(
+        context,
+        PubPackageBuilder(context),
+      );
     }
 
     group('Option handling', () {
diff --git a/test/src/utils.dart b/test/src/utils.dart
index da3d2b1..66cb3a3 100644
--- a/test/src/utils.dart
+++ b/test/src/utils.dart
@@ -114,7 +114,7 @@
 }
 
 Future<PackageGraph> bootSdkPackage() async {
-  return PackageBuilder(await contextFromArgv(['--input', sdkDir.path]))
+  return PubPackageBuilder(await contextFromArgv(['--input', sdkDir.path]))
       .buildPackageGraph();
 }
 
@@ -123,7 +123,7 @@
     {List<String> additionalArguments}) async {
   var dir = Directory(dirPath);
   additionalArguments ??= <String>[];
-  return PackageBuilder(await contextFromArgv([
+  return PubPackageBuilder(await contextFromArgv([
             '--input',
             dir.path,
             '--sdk-dir',
