one of my least favourite moments when writing a package is trying to settle on the internal structure of its objects. it's easy to find something that works, but much harder to find something that will work cleanly and be extensible later. it takes several unpleasant refactors before it feels right