I will remove smart_ptr next
Use std::shared_ptr instead