use c++11, so we have access to std::unique_ptr, std::shared_ptr etc