This is starting to feel more like a separate method:

```ruby
def self.subclass_for_page(page)
  subclasses.detect { |s| s.matches?(page) } || no_match!
end

def self.no_match!
  raise NoMatch.new("…")
end
```

That way, a developer can easily override this behavior if needed.