Broke up arcane service into separate files

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2025-04-29 19:18:38 +02:00
parent 3ef93bb3f9
commit 25b456a664
4 changed files with 89 additions and 84 deletions
@@ -0,0 +1,51 @@
part of "arcane_service.dart";
/// An extension on `BuildContext` to provide easy access to `ArcaneService` instances
/// that are registered in an `ArcaneServiceProvider`.
///
/// This extension provides methods for retrieving services in various ways.
///
/// Example usage:
/// ```dart
/// final myService = context.service<MyService>();
/// ```
extension ServiceProviderExtension on BuildContext {
/// Finds and returns the `ArcaneService` instance of type `T` that has been registered
/// in the `ArcaneServiceProvider` or in the list of built-in services (`Arcane.services`).
///
/// If no such service is found, it returns `null`.
///
/// Example:
/// ```dart
/// final myService = context.service<MyService>();
/// ```
T? service<T extends ArcaneService>() {
// First check built-in services
final builtInService = Arcane.services.whereType<T>().firstOrNull;
if (builtInService != null) return builtInService;
// Then check provider
return ArcaneServiceProvider.serviceOfType<T>(this);
}
/// Finds and returns the `ArcaneService` instance of type `T` that has been registered
/// in the `ArcaneServiceProvider` or in the list of built-in services (`Arcane.services`).
///
/// Throws an assertion error if no service is found.
///
/// Example:
/// ```dart
/// final myService = context.requiredService<MyService>();
/// ```
T requiredService<T extends ArcaneService>() {
final service = this.service<T>();
assert(service != null, "No service of type $T found");
return service!;
}
/// Legacy method to maintain backward compatibility.
///
/// Prefer using `service<T>()` instead.
@Deprecated("Use service<T>() instead")
T? serviceOfType<T extends ArcaneService>() => service<T>();
}