wip:extract abstract classes
wip