design a replacement for boost::signal