任意単位のDate#step

が欲しくなったので、以下のようにした。

class Date
  def step(limit, step = 1, method = :next_day)
    unless block_given?
      return to_enum(:step, limit, step, method)
    end
    da = self
    op = %w(- <= >=)[step <=> 0]
    while da.__send__(op, limit)
      yield da
      da = da.__send__(method, step)
    end
    self
  end
end

基本部分は本実装からコピペ。
使用例:20世紀中の日曜日から始まる月を数える。

Date.new(1901, 1, 1).step(Date.new(2000, 12, 31), 1, :next_month).select{ |d| d.sunday? }.count.display

まあつまり、Project Eulerの19問目を解きたかっただけです。
select{ |d| d.day == 1 && d.sunday? } でも良かったんだけど、気分的に「毎月」で回したかった。
これ、DateTime#next_hourとかDateTime#next_secとか作ればそっちにも応用できるし結構便利だと思う。標準で欲しいなぁ。それとも他にもっといい方法があったりするんだろうか。