module I
module ClassMethods
def init(**kwargs)
(@_i ||= {}).merge!(kwargs)
end
end
module InstanceMethods
def initialize(*)
super if defined? super
self.class.instance_variable_get(:@_i).each do |k, v|
singleton_class.class_eval { attr_accessor k }
instance_variable_set("@#{k}", v)
end
end
end
def self.included(receiver)
receiver.extend ClassMethods
receiver.include InstanceMethods
end
end
class A
include I
init(a: 42)
end
p A.new.a