export abstract class Drawable { protected dirty: boolean = true; abstract doDraw(): void; draw() { if (this.dirty) { this.doDraw(); this.dirty = false; } } invalidate() { this.dirty = true; } }