add Collectable class, reduce boilerplate for Pools