handler now receives void* callback