Shouldn't we make this a sealed abstract class instead?