clearAll method

void clearAll({
  1. bool force = false,
})

Clear all dependencies from this scope

Implementation

void clearAll({bool force = false}) {
  if (_disposed) {
    return;
  }

  // Clear type bindings
  final typeInstances = Map<Type, dynamic>.from(_typeBindings);
  for (final entry in typeInstances.entries) {
    final type = entry.key;
    final instance = entry.value;

    // Check permanence
    final key = _getDependencyKey(type, null);
    final isPermanent = _useCount[key] == -1;

    if (!isPermanent || force) {
      _typeBindings.remove(type);
      _useCount.remove(key);

      // Dispose if it's a controller OR service
      if (instance is ZenController && !instance.isDisposed) {
        try {
          instance.dispose();
        } catch (e) {
          ZenLogger.logError(
              'Error disposing controller during clearAll: $e');
        }
      } else if (instance is ZenService && !instance.isDisposed) {
        try {
          instance.dispose();
        } catch (e) {
          ZenLogger.logError('Error disposing service during clearAll: $e');
        }
      }
    }
  }

  // Clear tagged bindings
  final taggedInstances = Map<String, dynamic>.from(_taggedBindings);
  for (final entry in taggedInstances.entries) {
    final tag = entry.key;
    final instance = entry.value;
    final type = instance.runtimeType;

    // Check permanence
    final key = _getDependencyKey(type, tag);
    final isPermanent = _useCount[key] == -1;

    if (!isPermanent || force) {
      _taggedBindings.remove(tag);
      _useCount.remove(key);

      // Update type-to-tags tracking
      _typeToTags[type]?.remove(tag);
      if (_typeToTags[type]?.isEmpty ?? false) {
        _typeToTags.remove(type);
      }

      // Dispose if it's a controller OR service
      if (instance is ZenController && !instance.isDisposed) {
        try {
          instance.dispose();
        } catch (e) {
          ZenLogger.logError(
              'Error disposing controller during clearAll: $e');
        }
      } else if (instance is ZenService && !instance.isDisposed) {
        try {
          instance.dispose();
        } catch (e) {
          ZenLogger.logError('Error disposing service during clearAll: $e');
        }
      }
    }
  }

  // Clear factories
  if (force) {
    _factories.clear();
    // Remove any remaining use count entries for factories
    _useCount.removeWhere((key, value) => value == -2);
  } else {
    // Only remove non-permanent factories
    final factoriesToRemove = <String>[];
    for (final entry in _factories.entries) {
      final factoryKey = entry.key;
      // Check if this factory is non-permanent
      final matchingKeys = _useCount.entries.where((e) =>
          e.value != -1 && // Not permanent
          e.value != -2); // Not a factory pattern

      if (matchingKeys.isNotEmpty) {
        factoriesToRemove.add(factoryKey);
      }
    }

    for (final key in factoriesToRemove) {
      _factories.remove(key);
    }
  }

  ZenLogger.logDebug('Cleared all dependencies from scope: $name');
}