@@ -23,6 +23,15 @@ class ProviderStatus(Enum):
23
23
24
24
25
25
class FeatureProvider (typing .Protocol ): # pragma: no cover
26
+ def attach (
27
+ self ,
28
+ on_emit : typing .Callable [
29
+ [FeatureProvider , ProviderEvent , ProviderEventDetails ], None
30
+ ],
31
+ ) -> None : ...
32
+
33
+ def detach (self ) -> None : ...
34
+
26
35
def initialize (self , evaluation_context : EvaluationContext ) -> None : ...
27
36
28
37
def shutdown (self ) -> None : ...
@@ -68,6 +77,18 @@ def resolve_object_details(
68
77
69
78
70
79
class AbstractProvider (FeatureProvider ):
80
+ def attach (
81
+ self ,
82
+ on_emit : typing .Callable [
83
+ [FeatureProvider , ProviderEvent , ProviderEventDetails ], None
84
+ ],
85
+ ) -> None :
86
+ self ._on_emit = on_emit
87
+
88
+ def detach (self ) -> None :
89
+ if hasattr (self , "_on_emit" ):
90
+ del self ._on_emit
91
+
71
92
def initialize (self , evaluation_context : EvaluationContext ) -> None :
72
93
pass
73
94
@@ -141,6 +162,5 @@ def emit_provider_stale(self, details: ProviderEventDetails) -> None:
141
162
self .emit (ProviderEvent .PROVIDER_STALE , details )
142
163
143
164
def emit (self , event : ProviderEvent , details : ProviderEventDetails ) -> None :
144
- from openfeature .provider ._registry import provider_registry
145
-
146
- provider_registry .dispatch_event (self , event , details )
165
+ if hasattr (self , "_on_emit" ):
166
+ self ._on_emit (self , event , details )
0 commit comments