add smart pointer