static A copyFields(O x, A y, S... fields) { if (empty(fields)) { // assume we should copy all fields Map map = objectToMap(x); for (S field : map.keySet()) setOpt(y, field, map.get(field)); } else for (S field : fields) { O o = getOpt(x, field); if (o != null) setOpt(y, field, o); } ret y; } static A copyFields(O x, A y, Collection fields) { ret copyFields(x, y, asStringArray(fields)); }