more CRTP, less code repetition