```ruby
unless valid?
  raise ArgumentError, "directives are invalid"
end
```

you would lose the specific-ness that validate! has, but you wouldn't need to implement `valid?` on top of rescue anymore.
which is more useful? a return value that indicated the failure could be returned here and the raise could happen in `#initialize`.