procedure permissiveAssign; [DEST, SRC] overload permissiveAssign(dest:DEST, src:SRC) { dest = DEST(src); // convert to DEST type } [S | CCompatibleString?(S)] overload permissiveAssign(dest:Pointer[Int8], src:S) { dest = cstring(src); // convert String to Pointer[Int8] } [T] overload permissiveAssign(dest:T, src:T) { dest = src; // for same types, use normal assignment }