must be pickleable