replace sigslot with std::function