replace va_list with type-safe parameters