修改版本，更通用的封装