You could also make this concrete and have a function called `onDestroy` that sub-classes are required to implement. And then it could look like this

```
private[spark] def destroy() {
  _isValid = false
  onDestroy()
}
```
This would make it so you don't count on subclasses to deal with the valid bit.