i'm having overdone fun with opaque types, but toString() seems to be a leak in the abstraction that can't be plugged?