OK, having reloaded this a bit, here's what I've learned.

It may be easiest to illustrate the chained string methods by showing how the output builds up.

    * 1.9.3p194 :074 > Embeddable::Smartgraph::RangeQuestion.model_name
     => "Embeddable::Smartgraph::RangeQuestion" 
    1.9.3p194 :075 > Embeddable::Smartgraph::RangeQuestion.model_name.demodulize
     => "RangeQuestion" 
    1.9.3p194 :077 > Embeddable::Smartgraph::RangeQuestion.model_name.demodulize.underscore
     => "range_question" 
    1.9.3p194 :078 > Embeddable::Smartgraph::RangeQuestion.model_name.demodulize.underscore.humanize
     => "Range question" 
    1.9.3p194 :079 > Embeddable::Smartgraph::RangeQuestion.model_name.demodulize.underscore.humanize.titlecase
     => "Range Question" 

Several classes don't need all these methods - `Investigation` is one - but this is one of several which needs them all to produce the expected response. If we don't use `underscore` the `humanize`

* We do need the `demodulize` bit, because otherwise we'll get `Embeddable::Smartgraph::RangeQuestion` instead of `RangeQuestion`.
* Using `model_name.human` looks good, but is problematic because, in this case, it returns "Smartgraph Range Question", which is usable but will represent a change from the previous behavior. In most other cases (including modularized code) it returns good strings, but often not titlecased, so we'd probably use `model_name.human.titlecase`.

Should `display_name` work only on classes or on either classes or instances? I think only on classes; looking at the code base, I found only one place where it's called on an instance; most calls are of the `instance.class.display_name` form. (Quite a few are even `instance.class.display_name.downcase`.)

Next question, though: do we need `display_name` at all?

I found four controller, two helpers, and a library (`lib/clipboard.rb`) where it's used. One of the helpers is the application helper, which uses it extensively. The controllers use it exclusively in error messages. All of them could be replaced. One hitch with that is that it removes the ability to override the display_name with a custom model method, so I would argue that just replacing it with `model_name.human.titlecase` and making explicit that it expects a class and not an instance should be enough.