In order to keep puppet manifests readable I'm organising the configuration using classes that (roughly) group steps by function such as PHP configuration, VHOST setup or Ruby installation. One of the main problems I (and several of my colleagues) were finding is that the order in which puppet classes are executed can change between one provision run and the next. However, with a little research (AKA reading the manual) I came across stages which exist to help with this very problem.
Puppet allows you to take a phased approach with the provisioning process, part of the stage definition is to declare if this stage should be executed before or after other stages. Once a stage is defined you then assign classes to it for execution. Puppet defines a 'main' stage by default in which all classes are added unless you specifically assign them to another stage as just described. The main stage is the starting point from which we reference when creating further stages.