factored role from HackaMol::X::Calculator