[FEATURE] allow shared_ptr return type