--------------------------------------------------------------------------------

To provide a psuedo backward compatible layer.

In plugin.dart:

/**
 * A function used to register an extension point with the given simple
 * [identifier]. If given, the [validator] will be used to validate extensions
 * to the extension point.
 *
 * An [ExtensionError] will be thrown if the extension point cannot be
 * registered, such as when a plugin attempts to define two extension points
 * with the same simple identifier.
 */
typedef ExtensionPoint RegisterExtensionPoint(String identifier,
    [ValidateExtension validateExtension]);

class Plugin {
  /**
   * Use the [register] function to register all of the extension points
   * contributed by this plugin.
   *
   * Clients should not invoke the [register] function after this method has
   * returned.
   *
   * This method is deprecated and will be removed in the next breaking release.
   * Plugins should migrate to using [registerExtensionPoints2].
   */
  void registerExtensionPoints(RegisterExtensionPoint register);
}

In plugin_impl.dart:

class ExtensionManager {

  In processPlugins:

      for (Plugin plugin in plugins) {
        plugin.registerExtensionPoints((String identifier,
            [ValidateExtension validateExtension]) =>
          registerExtensionPoint(plugin, identifier, validateExtension));
      }

  /**
   * Register an extension point being defined by the given [plugin] with the
   * given simple [identifier] and [validateExtension].
   */
  ExtensionPoint registerExtensionPoint(
        Plugin plugin, String identifier, ValidateExtension validateExtension) {
    String uniqueIdentifier = Plugin.buildUniqueIdentifier(plugin, identifier);
    if (extensionPoints.containsKey(uniqueIdentifier)) {
      throw new ExtensionError(
            'There is already an extension point with the id "$identifier"');
    }
    ExtensionPointImpl extensionPoint =
          new ExtensionPointImpl(plugin, identifier, validateExtension);
    extensionPoints[uniqueIdentifier] = extensionPoint;
    return extensionPoint;
  }
}

--------------------------------------------------------------------------------
