As Far as I See, you check all the combinations of methods in wideness order.
Why not have a generic wrapper struct, that is filled with the underlying driver.Conn's methods,
and use that if not nil, but use the generic implementation if not.
Like
```
type wrappedConn struct {
driver.Conn
queryContext func(...)
}
func (wc wrappedConn) QueryContext(...) ... {
if wc.queryContext != nil { return wc.queryContext(...) }
return wc.Conn.Query(...)
}
```
This way you only have to check for each method on driver.Conn, and fill the wrappedConn's functions as they axist/not.