@@ -92,9 +92,44 @@ def __getattr__(attr):
92
92
owner_module .__dict__ ['__getattr__' ] = __getattr__
93
93
94
94
95
+ @builtin
96
+ def auto_wrap_methods (delegate_name , delegate_attributes , owner_globals ):
97
+ func_type = type (import_current_as_named_module )
98
+
99
+ new_globals = dict (** owner_globals )
100
+
101
+ for attr in owner_globals :
102
+ if attr .startswith ("__" ):
103
+ continue
104
+ elif not isinstance (owner_globals [attr ], func_type ):
105
+ continue
106
+ elif attr not in delegate_attributes :
107
+ raise AttributeError ("attribute '{}' not allowed in module '{}', permitted values are: '{}'" .format (
108
+ attr , __name__ , delegate_attributes
109
+ ))
110
+
111
+ if attr in delegate_attributes :
112
+ def make_wrapper (attribute , method ):
113
+ @__graalpython__ .builtin
114
+ def wrapper (* args , ** kwargs ):
115
+ try :
116
+ return method (* args , ** kwargs )
117
+ except :
118
+ delegate_module = __import__ (delegate_name )
119
+ return getattr (delegate_module , attribute )(* args , ** kwargs )
120
+ return wrapper
121
+
122
+ new_globals [attr ] = make_wrapper (attr , owner_globals [attr ])
123
+
124
+ return new_globals
125
+
126
+
95
127
@builtin
96
128
def import_current_as_named_module_with_delegate (module_name , delegate_name , delegate_attributes = None ,
97
- owner_globals = None ):
129
+ owner_globals = None , wrap_methods = True ):
98
130
owner_module = import_current_as_named_module (module_name , owner_globals = owner_globals )
131
+ if wrap_methods and owner_globals :
132
+ wrapped_globals = auto_wrap_methods (delegate_name , delegate_attributes , owner_globals )
133
+ owner_module .__dict__ .update (** wrapped_globals )
99
134
if delegate_attributes :
100
135
lazy_attributes_from_delegate (delegate_name , delegate_attributes , owner_module )
0 commit comments