clean code, use boost::function for callbacks