long-overdue abstraction