module WrapIt::Enums::ClassMethods

{Enums} class methods

Public Instance Methods

enum(name, values, opts = {}, &block) click to toggle source

Adds `enum`. When element created, creation arguments will be scanned for `Symbol`, that included contains in `values`. If it founded, enum takes this value. Also creation options inspected. If its contains `name: value` key-value pair with valid value, this pair removed from options and enum takes this value.

If you set `html_class` option to `true`, with each enum change, HTML class, composed from `html_class_prefix` and enum `value` will be added to element. If you want to override this prefix, specify it with `html_class_prefix` option. By default, enum changes are not affected to html classes.

This method also adds getter and setter for this enum.

@example

class Button < WrapIt::Base
  enum :style, %i(red green black), html_class_prefix: 'btn-'
end

btn = Button.new(template, :green)
btn.render # => '<div class="btn-green">'
btn = Button.new(template, style: :red)
btn.render # => '<div class="btn-red">'

@param name [String, Symbol] Enum name. Converted to `Symbol`. @param opts [Hash] Enum options @option opts [String, Symbol] :html_class_prefix prefix of HTML

class that will automatically added to element if enum changes its
value.

@option opts [Boolean] :html_class whether this enum changes

should affect to html class.

@option opts [Symbol, Array<Symbol>] :aliases list of enum aliases.

Warning! Values are not converted - pass only `Symbols` here.

@option opts [String, Symbol] :default default value for enum,

if nil or wrong value given. Converted to `Symbol`.

@yield [value] Runs block when enum value changed, gives it to block. @yieldparam value [Symbol] New enum value. @yieldreturn [void]

@return [void]

# File lib/wrap_it/enums.rb, line 80
def enum(name, values, opts = {}, &block)
  opts.symbolize_keys!
  name = name.to_sym
  opts.merge!(block: block, name: name, values: values)
  opts.key?(:default) && opts[:default] = opts[:default].to_sym
  if opts.delete(:html_class) == true || opts.key?(:html_class_prefix)
    opts[:html_class_prefix].is_a?(Symbol) &&
      opts[:html_class_prefix] = opts[:html_class_prefix].to_s
    prefix = html_class_prefix
    opts[:html_class_prefix].is_a?(String) &&
      prefix = opts[:html_class_prefix]
    opts[:regexp] = /\A#{prefix}(?:#{values.join('|')})\z/
    opts[:html_class_prefix] = prefix
  end
  define_method("#{name}") { @enums[name] ||= opts[:default] }
  define_method("#{name}=", &Enums.setter(name, &block))
  @enums ||= {}

  o_params = {}
  if opts.key?(:aliases)
    aliases = [opts[:aliases]].flatten.compact
    o_params[:if] = [name] + aliases
  end

  @enums[name] = opts
  option(name, **o_params) { |_, v| send("#{name}=", v) }
  argument(name, if: Symbol, and: values) { |_, v| send("#{name}=", v) }
end