diff --git a/Sources/LuminateDI/Injected.swift b/Sources/LuminateDI/Injected.swift new file mode 100644 index 0000000..8271895 --- /dev/null +++ b/Sources/LuminateDI/Injected.swift @@ -0,0 +1,32 @@ +import Adwaita +import Foundation + +@propertyWrapper +public struct Injected { + + private let keyPath: KeyPath + private let observerRef: ObserverRef + + public var wrappedValue: T { + DIContainer.shared.resolve(keyPath) + } + + public init(_ keyPath: KeyPath) { + self.keyPath = keyPath + self.observerRef = ObserverRef() + observerRef.id = DIContainer.shared.addObserver(for: keyPath) { + Task { @MainActor in + StateManager.updateViews() + } + } + } +} + +private final class ObserverRef { + var id: UUID? + deinit { + if let id { + DIContainer.shared.removeObserver(id) + } + } +}