Config = {
  # 対応するメディアタイプの拡張子
  :typemap => %w(xhtml html atom json)
}

class Resource
  Config[:typemap].each do |i|
    # Resource#to_xhtml, Resource#to_html, ... を定義する
    define_method("to_#{i}") do
      # Resource#to_xml はコアで対応させておく
      xslt_processor.load(:source => self.to_xml, :template => open("flavour.#{i}.xslt"))
      xslt_processor.transform
    end
  end

  def xslt_processor
    @xslt_processor ||= XSLT::Processor.new # てきとーなラッパ
  end
end

def get
  resource = Resource.new
  media_type = headers.negotiate(:accept)
  # 適切な to_hoge メソッドへ
  resource.__send__("to_#{media_type}")
end

ビューっぽいけどモデルっぽいような気もする。とか MVC をきっちり理解していないやつが言う。

Resource#xslt_processor みたいなアクセサの書き方をよくするんだけど、どうなんだろう。いや、 ||= という代入の仕方はメジャーだとおもうけど、アクセサではどうなんだろうっていう。
HTTP のリクエスト (とリクエスト) をあらわすクラスを作って、コントローラにそれぞれのインスタンスを持たせるようにしているんだけど、リクエストのインスタンスに触る必要がまったくないとき (単に Hello World するときとか) はインスタンスを作らないようにするという。
gdgd と説明ぽいことしたけど、よくかんがえたらありふれているよなあ。ばかばかしい。
でも ||= がどういうもんなのかを知った上で勝手に思いついたので気に入っている。おれってあたまいーみたいな。