add hasPermission() checks