using boost::smart_ptr instead std::auto_ptr