module ConfigurableConcern
extend ActiveSupport::Concern
VARIATIONS = %I[variation_a variation_b].freeze
included do
class_attribute :__configurable_concern_variation, instance_writer: false
end
def self.included(base)
base.__configurable_concern_variation = @__configurable_concern_variation
end
VARIATIONS.each do |variation|
define_singleton_method variation do
with_variation(variation)
end
define_method "#{variation}?" do
__configurable_concern_variation == variation
end
end
def self.with_variation(variation)
raise ArgumentError, "Not allowed variation value" if VARIATIONS.exclude?(variation)
@__configurable_concern_variation = variation
self
end
def example_method
variation_a? ? 2 : 3
end
end