You can think of something like below :
class Yeah
def self.reader_meth
%i(foo fool feel).each do |m|
define_method(m){instance_variable_get("@#{m}").dup.freeze}
end
end
def initialize(foo: "test", fool: {}, feel: [])
@foo = foo
@fool = fool
@feel =feel
end
reader_meth
end
test = Yeah.new
test # => #<Yeah:0x8975498 @foo="test", @fool={}, @feel=[]>
test.fool[:one] = 10 # can't modify frozen Hash (RuntimeError)
test # => #<Yeah:0x8975498 @foo="test", @fool={}, @feel=[]>