sclass Flattener { new L out; *() {} *(O... l) { add(l); } void add(O o) { ifdef Flattener_debug print("add " + className(o)); endifdef if (o cast O[]) for (x : o) add(x); else if (o cast Iterable) for (x : o) add(x); else if (o != null) out.add(o); } void add(O... l) { add((O) l); } L toList() { ret out; } O[] toArray() { ret toObjectArray(out); } }