Opaque types for arguments? How does that work? Clients can't promise to always pass the same concrete type.