iterate(VarBindings, ValueBindings, ListsCubed).
iterate([], [], []).
+gather_modules(Attrs, []) :- var(Attrs), !.
+gather_modules([Attr|Attrs], [Module|Modules]) :-
+ '$module_of'(Module, Attr), % write the owning module of Attr to Module.
+ gather_modules(Attrs, Modules).
+
+verify_attrs([Module|Modules], Var, Value, [Goals|ListOfGoalLists]) :-
+ catch(Module:verify_attributes(Var, Value, Goals),
+ error(evaluation_error((M:verify_attributes)/3), verify_attrs/3),
+ Goals = []),
+ verify_attrs(Modules, Var, Value, ListOfGoalLists).
+verify_attrs([], _, _, []).
+
call_verify_attributes(Attrs, _, _, []) :-
var(Attrs), !.
-call_verify_attributes([Attr|Attrs], Var, Value, [Goals|ListOfGoalLists]) :-
- '$module_of'(M, Attr), % write the owning module of Attr to M.
- catch(M:verify_attributes(Var, Value, Goals),
- error(evaluation_error((M:verify_attributes)/3), verify_attributes/3),
- Goals = []),
- call_verify_attributes(Attrs, Var, Value, ListOfGoalLists).
+call_verify_attributes([Attr|Attrs], Var, Value, ListOfGoalLists) :-
+ gather_modules([Attr|Attrs], Modules0),
+ sort(Modules0, Modules),
+ verify_attrs(Modules, Var, Value, ListOfGoalLists).
call_goals([ListOfGoalLists | ListsCubed]) :-
call_goals_0(ListOfGoalLists),