TextWrapper: achieving composition, one step at a time