def has_many(region_name, **opts, &block)
      region_class = opts[:class] || opts[:region_class]
      collection_class = opts[:through] || opts[:collection_class]
      each = opts[:each] || raise(ArgumentError, '"has_many" method requires "each" param')
      within = opts[:in] || opts[:within]
      define_region_accessor(region_name, within: within, each: each, region_class: region_class, collection_class: collection_class, &block)
      define_finder_method(region_name)
    end
def has_many(region_name, **opts, &block)
      region_class = opts[:class] || opts[:region_class]
      collection_class = opts[:through] || opts[:collection_class]
      each = opts[:each] || raise(ArgumentError, '"has_many" method requires "each" param')
      within = opts[:in] || opts[:within]
      define_region_accessor(region_name, within: within, each: each, region_class: region_class, collection_class: collection_class, &block)
      define_finder_method(region_name)
    end
Defines multiple regions accessor.

 @param [Symbol] region_name
 @param [Hash|Proc] in, optional, alias: within
 @param [Hash] each, required
 @param [Class] class, optional, alias: region_class
 @param [Class] through, optional, alias collection_class
 @param [Block] block, optional