Ruby の attr_reader に対する疑問

Ruby の attr_reader メソッドを使うとインスタンス変数に読み込み専用でアクセスする事ができます。

class X
    def initialize
        @data = { filename: "test.txt" }
    end
    attr_reader :data
end

x = X.new

x.data          # OK
x.data[:fname] # OK
x.data = {}     # ERROR


ただし、これはインスタンス変数に書き込むことができないだけで、アクセッサが返したオブジェクトは書き換えることができます。

class X
    def initialize
        @data = { filename: "test.txt" }
    end
    attr_reader :data
end

x = X.new

x.data                          # OK
x.data[:filename] = "foo.txt"   # OK


(当たり前といえば当たり前だけど)これがすごいもにょるんですけど、いい感じに回避する方法ってないんですかね。
一応、以下のように #clone を返すのは思いついた。

class X
    def initialize
        @data = { filename: "test.txt" }
    end

#  attr_reader :data
    def data
        @data.clone.freeze
    end
end

x = X.new

x.data[:filename] = "foo.txt"   # ERROR


割と力技。
RubyC++ でいう const みたいなのがあれば…。