こんなのはどうかな。メソッド内だけでローカルではないけれども
すぐ外のブロックだけでスコープが終わるので、クラス変数みたいに
どっかからこっそりいじられる心配からは解放されるんじゃないかと。

class A
end

catch (:foo) {
sum = 0
A.__send__(:define_method, :f) { |x| sum += x; sum }
A.__send__(:public, :f)
}

a = A.new
p a.f(10)
p a.f(10)

catchは無引数のブロックを1回だけ実行する関数として使ってる
だけです。