@@ -37,6 +37,28 @@ def _get_func_by_attr(attr, *configs):
3737 return func , config .obj
3838
3939
40+ def _build_attr_wrapper (attr : str , obj ):
41+ # if `attr` is not callable, then it's an attribute or property,
42+ # so `func` contains it's current value.
43+ # we'll build a method that get's the fresh value for each call
44+ getter = attrgetter (attr )
45+
46+ def wrapper (* args , ** kwargs ):
47+ return getter (obj )
48+
49+ return wrapper
50+
51+
52+ def _build_sm_event_wrapper (func ):
53+ "Events already have the 'machine' parameter defined."
54+
55+ def wrapper (* args , ** kwargs ):
56+ kwargs .pop ("machine" , None )
57+ return func (* args , ** kwargs )
58+
59+ return wrapper
60+
61+
4062def ensure_callable (attr , * objects ):
4163 """Ensure that `attr` is a callable, if not, tries to retrieve one from any of the given
4264 `objects`.
@@ -56,33 +78,24 @@ def ensure_callable(attr, *objects):
5678 func , obj = _get_func_by_attr (attr , * configs )
5779
5880 if not callable (func ):
59- # if `attr` is not callable, then it's an attribute or property,
60- # so `func` contains it's current value.
61- # we'll build a method that get's the fresh value for each call
62- getter = attrgetter (attr )
63-
64- def wrapper (* args , ** kwargs ):
65- return getter (obj )
66-
67- return wrapper
81+ return _build_attr_wrapper (attr , obj )
6882
6983 if getattr (func , "_is_sm_event" , False ):
70- "Events already have the 'machine' parameter defined."
71-
72- def wrapper (* args , ** kwargs ):
73- kwargs .pop ("machine" )
74- return func (* args , ** kwargs )
75-
76- return wrapper
84+ return _build_sm_event_wrapper (func )
7785
7886 return SignatureAdapter .wrap (func )
7987
8088
8189def resolver_factory (* objects ):
8290 """Factory that returns a configured resolver."""
8391
92+ objects = [ObjectConfig .from_obj (obj ) for obj in objects ]
93+
8494 @wraps (ensure_callable )
8595 def wrapper (attr ):
8696 return ensure_callable (attr , * objects )
8797
98+ resolver_id = "." .join (str (id (obj .obj )) for obj in objects )
99+ wrapper .id = resolver_id
100+
88101 return wrapper
0 commit comments