semantically looks like a standard each iterator, but route.call uses throw statement to stop iteration on first match, executing only the first matching route.
Perhaps something like:

```ruby
route = self.class.routes[@request.request_method].detect { |route| route.match(@request) }
route.call(self)
```
gives a more readable and semantically correct api?

But I thought that a "tell don't ask" approach was the way to go with this. If the route is responsible for matching with a request, why we should be asking from the outside if it matches or not in order to execute it?

Anyway, I agree that the catch :halt is a bit hacky at first sight.