Logic program analyzers typically employ abstract interpretation and consist of two main components: an abstract domain and a generic iterative fixed-point computation or "engine". In earlier work, we presented a new engine based on an unfolding operation, and showed that it was uniformly more accurate than the standard engine. This unfolding engine however had a crucial limitation: it could not be generalized to constraint logic programming (CLP). In this paper, we develop a fundamentally different view of unfolding, based on a uniform treatment of constraints. The result is a family of analysis algorithms which is modular in the sense that CLP is modular over computation domains. Not only is the new engine more general, but it is also simpler and more flexible. In particular, it provides new opportunities for tuning efficiency/accuracy tradeoffs. At one end of the spectrum, the engine can be used to describe the standard engine; at the other end is an algorithm that is more accurate..