Since the only vallues not passng `!` check are `nil` and `false` (except if someone chose to override the `!` method on their object which I think we can disregard), I think this can be simplified further to:

A few more lines than your snippet, but less density per line, and IMO clearer breakdown of logic.

```ruby
layout = controller.send(proc)

case layout
when nil
  call(controller_class)
when false, String
  layout
else
  raise ArgumentError, "Your layout method :#{proc} returned #{layout}. It " \
  "should have returned a String, false, or nil"
end
```