enhance reverse engineering

Well, that's my point, they *shouldn't* be nicely separated, they depend on the driver and they are called from the driver (so there are no issues with path-dependent types). I'd put them into a separate JdbcModelComponent, together with the other reverse-engineering-related functions which are now in JdbcProfile. That way you can implement JdbcProfile with or without the reverse-engineering stuff and know at compile-time whether that feature is supported by a driver.