Sha256: d6f6d9e00f55d532c8011eab793ecd2c31d1b1647eace88be3381fe5b5015cef

Contents?: true

Size: 1.16 KB

Versions: 2

Compression:

Stored size: 1.16 KB

Contents

module Exposant
  module Exposable
    module Model
      extend ActiveSupport::Concern

      def exhibitor(variant = nil)
        self.class.exhibitor_class(variant).new(self)
      end

      module ClassMethods
        def exhibitor(obj, variant = nil)
          obj.extend(Exposable::Collection)
          obj.model_klass = self

          obj.exhibitor(variant)
        end

        def exhibitor_class(variant = nil)
          klass = [
            name,
            variant&.downcase&.capitalize,
            'Exhibitor'
          ].join

          raise "Missing exhibitor #{klass}" unless const_defined?(klass)

          klass.constantize
        end
      end
    end

    module Collection
      attr_accessor :model_klass

      def exhibitor(variant = nil)
        exhibitor_class(variant).new(self)
      end

      def exhibitor_class(variant = nil)
        klass_name = model_klass.name

        klass = [
          klass_name.pluralize,
          variant&.downcase&.capitalize,
          'Exhibitor'
        ].join

        begin
          klass.constantize
        rescue NameError
          raise "Missing exhibitor #{klass}"
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
exposant-0.1.2 lib/exposant/concerns/exposable.rb
exposant-0.1.1 lib/exposant/concerns/exposable.rb