better record abstraction