module MoneyAccessor::ClassMethods
def money_accessor(*columns)
def money_accessor(*columns) variable_get = self <= Struct ? :[] : :instance_variable_get variable_set = self <= Struct ? :[]= : :instance_variable_set Array(columns).flatten.each do |name| variable_name = self <= Struct ? name : "@#{name}" define_method(name) do value = public_send(variable_get, variable_name) value.blank? ? nil : Money.new(value) end define_method("#{name}=") do |value| if value.blank? || !value.respond_to?(:to_money) public_send(variable_set, variable_name, nil) nil else money = value.to_money public_send(variable_set, variable_name, money.value) money end end end end