class Generics
def initialize(raw_data)
raw_data.each do |att, val|
instance_variable_set "@#{att}", val
self.class.class_exec do
attr_reader att.to_sym
end
end
end
end
Тогда можно его создать:
g = Generics.new name: 'John', surname: 'Doe'
g.name # => 'John'
Естественно, на его основе можно делать "именованные" классы
class Generics
DeletedResource = Class.new(self)
EmptiedResource = Class.new(self)
# ...
end
Или добавить метод для доступа как к хэшу
def [](raw_key_attr)
key_attr = :"@#{raw_key_attr}"
return nil unless instance_variables.include?(key_attr)
instance_variable_get(key_attr)
end