change to callable
roughly complete