module MoneyColumn::ActiveRecordHooks::ClassMethods

def clear_cache_on_currency_change(currency_column)

def clear_cache_on_currency_change(currency_column)
  return if money_column_options.any? { |_, opt| opt[:currency_column] == currency_column }
  define_method "#{currency_column}=" do |value|
    clear_money_column_cache
    super(value)
  end
end

def inherited(subclass)

def inherited(subclass)
  subclass.instance_variable_set('@money_column_options', money_column_options.dup) if money_column_options
  super
end

def money_column(*columns, currency_column: nil, currency: nil, currency_read_only: false, coerce_null: false)

def money_column(*columns, currency_column: nil, currency: nil, currency_read_only: false, coerce_null: false)
  @money_column_options ||= {}
  options = normalize_money_column_options(
    currency_column: currency_column,
    currency: currency,
    currency_read_only: currency_read_only,
    coerce_null: coerce_null
  )
  if options[:currency_column]
    clear_cache_on_currency_change(options[:currency_column])
  end
  columns.flatten.each do |column|
    column_string = column.to_s.freeze
    @money_column_options[column_string] = options
    attribute(column_string, MoneyColumn::ActiveRecordType.new)
    define_method column do
      read_money_attribute(column_string)
    end
    define_method "#{column}=" do |money|
      write_money_attribute(column_string, money)
    end
  end
end

def normalize_money_column_options(options)

def normalize_money_column_options(options)
  raise ArgumentError, 'cannot set both :currency_column and :currency options' if options[:currency] && options[:currency_column]
  raise ArgumentError, 'must set one of :currency_column or :currency options' unless options[:currency] || options[:currency_column]
  if options[:currency]
    options[:currency] = Money::Currency.find!(options[:currency]).to_s.freeze
    options[:currency_read_only] = true
  end
  if options[:currency_column]
    options[:currency_column] = options[:currency_column].to_s.freeze
  end
  options
end