discoverAddons() {
    // prefer `packageRoot`, fallback to `root`; this is to maintain backwards compatibility for
    // consumers who create a new instance of the base addon model class directly and don't set
    // `packageRoot`
    let pkgInfo = this.packageInfoCache.getEntry(this.packageRoot || this.root);

    if (pkgInfo) {
      let addonPackageList = pkgInfo.discoverAddonAddons();
      this.addonPackages = pkgInfo.generateAddonPackages(
        addonPackageList,
        (addonInfo) => this.shouldIncludeChildAddon && !this.shouldIncludeChildAddon(addonInfo)
      );

      // in case any child addons are invalid, dump to the console about them.
      pkgInfo.dumpInvalidAddonPackages(addonPackageList);
    } else {
      // There are cases where an addon can be created in memory and not actually
      // have a root entry (or have one that is not actually pointing to a directory,
      // like 'foo' in some of the tests. We don't want to crash, but want to let
      // things continue even though they're empty.
      this.addonPackages = Object.create(null);
    }
  }
Discovers all child addons of this addon and an AddonInfo about
each addon in this.addonPackages (keyed on addon name).

Child addons include those from 'dependencies' (not devDependencies)
and in-repo addons

Any packageInfos that we find that are marked as not valid are excluded.

@private
@method discoverAddons