Sha256: aa2c2c57d84969ebcbba19b500cd6327d39e005219adc1d580d330bccbc91c4f

Contents?: true

Size: 1.22 KB

Versions: 2

Compression:

Stored size: 1.22 KB

Contents

# frozen_string_literal: true

module FoxTail::Concerns::HasOptions
  extend ActiveSupport::Concern

  RESERVED_OPTIONS = [FoxTail::Theme::BASE_KEY.to_s].freeze

  def options
    @options ||= self.class.default_options
  end

  def extract_options!(options = {})
    options.extract!(*registered_options.keys).each do |k, v|
      self.options[k.to_sym] = v
    end
  end

  included do
    class_attribute :registered_options, instance_writer: false, instance_predicate: false
    self.registered_options = {}
  end

  class_methods do
    def default_options
      registered_options.reject { |_,v| v[:default].blank? }.transform_values { |v| v[:default] }
    end

    def has_option(name, as: name, default: nil, type: nil)
      raise FoxTail::ReservedOption.new(self, as) if RESERVED_OPTIONS.include?(as.to_s)

      self.registered_options = registered_options.merge name => { name: name, as: as, default: default, type: type }

      define_method as do
        options[name]
      end

      define_method :"#{as}?" do
        if type == :boolean
          !!send(as)
        else
          send(as).present?
        end
      end
    end

    def extract_options(options = {})
      options.slice(*registered_options.keys)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
fox_tail-0.1.1 app/components/fox_tail/concerns/has_options.rb
fox_tail-0.1.0 app/components/fox_tail/concerns/has_options.rb