Refactored PP: classes outside, use IDirective, expose more properties