@m_seki の

I like ruby tooから引っ越し

TC

mixiでコミュニティ見つけた!

というわけでネタです。Koyaで使ってるBDBのサブクラスを載せます。操作にしっぱいしたら例外をあげるのと、BDBCURを生成するメソッドをつけただけ。
call_or_dieっていうclassメソッドにメソッド名(Symbol)を与えると、そのメソッドが失敗したら例外をあげるようになります。もっといい名前はないでしょか。

    class BDBError < RuntimeError
      def initialize(bdb)
        super(bdb.errmsg(bdb.ecode))
      end
    end

    class BDB < TokyoCabinet::BDB
      def exception
        BDBError.new(self)
      end
      
      def cursor
        TokyoCabinet::BDBCUR.new(self)
      end
      
      def self.call_or_die(*ary)
        file, lineno = __FILE__, __LINE__
        if /^(.+?):(\d+)(?::in `(.*)')?/ =~ caller(1)[0]
          file = $1
          lineno = $2.to_i
        end
        ary.each do |sym|
          module_eval("def #{sym}(*arg); super || raise(self); end",
                      file, lineno)
        end
      end
      
      call_or_die :open, :close
      call_or_die :tranbegin, :tranabort, :trancommit
      call_or_die :vanish
    end