explained that the third argument is for custom opts parser