Well `RecordSet` depends on the record classes having a public `hydrate` method. From my perspective that makes it part of the public interface. We could change `RecordSet` to create new records using `target_class.new_empty.hydrate(row)` and remove the `hydrate` class method if you prefer. Personally, that feels quite a bit worse to me. I'd rather make `LazyRecordSet` use the class method (and then remove the instance method version of `hydrate`) because hydration seems like a special case of `new`.