77from functools import wraps
88from types import MethodType
99from types import ModuleType as PythonModule
10- from typing import TYPE_CHECKING , Any , Concatenate , Self , final , overload
10+ from typing import TYPE_CHECKING , Any , Concatenate , Protocol , Self , final , overload
1111
1212from injection import Module
1313from injection .loaders import ProfileLoader , PythonModuleLoader
1414
15- __all__ = ("AsyncEntrypoint" , "Entrypoint" , "autocall" , " entrypointmaker" )
15+ __all__ = ("AsyncEntrypoint" , "Entrypoint" , "entrypointmaker" )
1616
17- type AsyncEntrypoint [** P , T ] = Entrypoint [P , Coroutine [Any , Any , T ]]
18- type EntrypointDecorator [** P , T1 , T2 ] = Callable [[Callable [P , T1 ]], Callable [P , T2 ]]
19- type EntrypointSetupMethod [** P , ** EPP , T1 , T2 ] = Callable [
20- Concatenate [Entrypoint [EPP , T1 ], P ],
21- Entrypoint [EPP , T2 ],
22- ]
2317
24- if TYPE_CHECKING : # pragma: no cover
18+ class _EntrypointDecorator [** P , T1 , T2 ](Protocol ):
19+ if TYPE_CHECKING : # pragma: no cover
2520
26- @overload
27- def autocall [T : Callable [..., Any ]](wrapped : T , / ) -> T : ...
28-
29- @overload
30- def autocall [T : Callable [..., Any ]](wrapped : None = ..., / ) -> Callable [[T ], T ]: ...
21+ @overload
22+ def __call__ (
23+ self ,
24+ wrapped : Callable [P , T1 ],
25+ / ,
26+ * ,
27+ autocall : bool = ...,
28+ ) -> Callable [P , T2 ]: ...
3129
30+ @overload
31+ def __call__ (
32+ self ,
33+ wrapped : None = ...,
34+ / ,
35+ * ,
36+ autocall : bool = ...,
37+ ) -> Callable [[Callable [P , T1 ]], Callable [P , T2 ]]: ...
3238
33- def autocall [ T : Callable [..., Any ]] (
34- wrapped : T | None = None ,
35- / ,
36- ) -> T | Callable [[ T ], T ]:
37- def decorator ( wp : T ) -> T :
38- wp ()
39- return wp
39+ def __call__ (
40+ self ,
41+ wrapped : Callable [ P , T1 ] | None = ... ,
42+ / ,
43+ * ,
44+ autocall : bool = ...,
45+ ) -> Any : ...
4046
41- return decorator (wrapped ) if wrapped else decorator
4247
48+ type AsyncEntrypoint [** P , T ] = Entrypoint [P , Coroutine [Any , Any , T ]]
49+ type EntrypointSetupMethod [** P , ** EPP , T1 , T2 ] = Callable [
50+ Concatenate [Entrypoint [EPP , T1 ], P ],
51+ Entrypoint [EPP , T2 ],
52+ ]
4353
4454# SMP = Setup Method Parameters
4555# EPP = EntryPoint Parameters
@@ -52,7 +62,7 @@ def entrypointmaker[**SMP, **EPP, T1, T2](
5262 / ,
5363 * ,
5464 profile_loader : ProfileLoader = ...,
55- ) -> EntrypointDecorator [EPP , T1 , T2 ]: ...
65+ ) -> _EntrypointDecorator [EPP , T1 , T2 ]: ...
5666
5767 @overload
5868 def entrypointmaker [** SMP , ** EPP , T1 , T2 ](
@@ -62,7 +72,7 @@ def entrypointmaker[**SMP, **EPP, T1, T2](
6272 profile_loader : ProfileLoader = ...,
6373 ) -> Callable [
6474 [EntrypointSetupMethod [SMP , EPP , T1 , T2 ]],
65- EntrypointDecorator [EPP , T1 , T2 ],
75+ _EntrypointDecorator [EPP , T1 , T2 ],
6676 ]: ...
6777
6878
@@ -74,7 +84,7 @@ def entrypointmaker[**SMP, **EPP, T1, T2](
7484) -> Any :
7585 def decorator (
7686 wp : EntrypointSetupMethod [SMP , EPP , T1 , T2 ],
77- ) -> EntrypointDecorator [EPP , T1 , T2 ]:
87+ ) -> _EntrypointDecorator [EPP , T1 , T2 ]:
7888 return Entrypoint ._make_decorator (wp , profile_loader )
7989
8090 return decorator (wrapped ) if wrapped else decorator
@@ -163,13 +173,26 @@ def _make_decorator[**_P, _T](
163173 setup_method : EntrypointSetupMethod [_P , P , T , _T ],
164174 / ,
165175 profile_loader : ProfileLoader | None = None ,
166- ) -> EntrypointDecorator [P , T , _T ]:
176+ ) -> _EntrypointDecorator [P , T , _T ]:
167177 profile_loader = profile_loader or ProfileLoader ()
168178 setup_method = profile_loader .module .make_injected_function (setup_method )
169179
170- def decorator (function : Callable [P , T ]) -> Callable [P , _T ]:
171- profile_loader .init ()
172- self = cls (function , profile_loader )
173- return MethodType (setup_method , self )().function
180+ def entrypoint_decorator (
181+ function : Callable [P , T ] | None = None ,
182+ / ,
183+ * ,
184+ autocall : bool = False ,
185+ ) -> Any :
186+ def decorator (fn : Callable [P , T ]) -> Callable [P , _T ]:
187+ profile_loader .init ()
188+ self = cls (fn , profile_loader )
189+ wrapper = MethodType (setup_method , self )().function
190+
191+ if autocall :
192+ wrapper ()
193+
194+ return wrapper
195+
196+ return decorator (function ) if function else decorator
174197
175- return decorator
198+ return entrypoint_decorator
0 commit comments