I think we should have a new class of object, which I am, for the time
being calling a ParticleRefiner to handle hierarchical collision
detection and generation of particles on the fly. I am currently using
it to generate particles to cover the edges of my unstructured chains in
order to better preserve excluded volume. The interface looks more or
less like:

And the methods must be called as a pair with the result of the first
method passed as the second argument to the second method.

To use this I currently have a PairScore which I apply to the nonbonded
pairs and a ParticleRefine which covers each bond with a set of
particles chosen to conserve volume. The PairScore then applies another
pair score to all pairs of refined particles. For that particle refined,
"refine" creates new particles and "cleanup" destroys them (it probably
makes sense to cache particles later).

ParticleRefines could also simply move down in a hierarchy, allowing
hierarchical collision detection and such. Then cleanup wouldn't do
anything at all.