initialize method

Future<void> initialize(
  1. Map<ModuleRegistryKey, ModuleController> globalModuleRegistry, {
  2. Set<Type>? resolutionStack,
  3. Set<ModuleGraphNodeKey>? graphResolutionStack,
})

Runs the full initialization lifecycle for this module.

Uses globalModuleRegistry to deduplicate module controllers across concurrent import branches. Pass graphResolutionStack for cycle detection when resolving nested imports.

Throws CircularDependencyException, ModuleConfigurationException, or ModuleLifecycleException on failure.

Implementation

Future<void> initialize(
  Map<ModuleRegistryKey, ModuleController> globalModuleRegistry, {

  /// Legacy type-only cycle stack. Prefer [graphResolutionStack].
  Set<Type>? resolutionStack,
  Set<ModuleGraphNodeKey>? graphResolutionStack,
}) {
  switch (_currentStatus) {
    case ModuleStatus.initial:
      _initializeFuture ??= _initializeInternal(
        globalModuleRegistry,
        resolutionStack: resolutionStack,
        graphResolutionStack: graphResolutionStack,
      );
      return _initializeFuture!;
    case ModuleStatus.loading:
      return _initializeFuture ?? Future<void>.value();
    case ModuleStatus.loaded:
      return Future<void>.value();
    case ModuleStatus.error:
      return Future<void>.error(
        ModuleLifecycleException(
          'Module ${module.runtimeType} failed to initialize previously. '
          'Create a new ModuleController to retry initialization.',
          moduleType: module.runtimeType,
          state: ModuleStatus.error,
        ),
      );
    case ModuleStatus.disposed:
      return Future<void>.error(
        ModuleLifecycleException(
          'Module ${module.runtimeType} has been disposed and cannot be initialized again.',
          moduleType: module.runtimeType,
          state: ModuleStatus.disposed,
        ),
      );
  }
}