lazily instantiate application subclasses

this means we can meaningfully override methods in the subclass