let refine_on data klass_name method_name refine_name actuals ret_type =
let refines = refinable_lookup data klass_name method_name refine_name in
let compat = List.filter (compatible_signature data ret_type actuals) refines in
let to_class map f = add_map_list f.inklass f map in
let by_class = List.fold_left to_class StringMap.empty compat in
let best funcs = match best_matching_signature data actuals funcs with
| [func] -> func
| _ -> raise(Failure("Compiler error finding a unique best refinement.")) in
let to_best klass funcs map = StringMap.add klass (best funcs) map in
let best_map = StringMap.fold to_best by_class StringMap.empty in
List.map snd (StringMap.bindings best_map)