rewrote vtable dispatcher based on sets