module WrapIt::Switches::ClassMethods

{Switches} class methods

Public Instance Methods

switch(name, options = {}, &block) click to toggle source

Adds `switch`. Switch is a boolean flag. When element created, creation arguments will be scanned for `Symbol`, that equals to `name`. If it founded, switch turned on. Also creation options inspected. If its contains `name: true` key-value pair, this pair removed from options and switch also turned on.

This method also adds getter and setter for this switch in form `name?` and `name=` respectively.

When `html_class` option specified and switch changes its state, HTML class for element will be computed as follows. if `html_class` options is `true`, html class produced from `html_class_prefix` and `name` of switch. If `html_class` is a String, Symbol or Array of this types, html class produced as array of `html_class_prefix` and each `html_class` concatinations. This classes added to element if switch is on or removed in other case.

@param name [String, Symbol] Switch name. Converted to `Symbol`. @param options [Hash] Switch options @option options [true, String, Symbol, Array<String, Symbol>] :html_class

HTML classes list that will automatically added to element if switch
is on or removed from element if switch id off.

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

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

@yield [state] Runs block when switch state changed, gives it to block. @yieldparam state [Boolean] Whether switch is on or off. @yieldreturn [Object, FalseClass] if you return `false`, value will

ommited.

@return [void]

# File lib/wrap_it/switches.rb, line 60
def switch(name, options = {}, &block)
  options.symbolize_keys!
  name = name.to_sym
  options.merge!(block: block, name: name)
  if options.key?(:html_class)
    options[:html_class] =
      if options[:html_class] == true
        [html_class_prefix + name.to_s]
      else
        HTMLClass.sanitize(options[:html_class]).map do |c|
          html_class_prefix + c
        end
      end
  end

  define_method("#{name}?") { @switches[name] == true }
  define_method("#{name}=", &Switches.setter(name, &block))
  @switches ||= {}

  @switches[name] = options

  o_params = {}
  a_params = { if: Symbol, and: name }
  if options.key?(:aliases)
    aliases = [options[:aliases]].flatten.compact
    o_params[:if] = [name] + aliases
    a_params[:and] = [name] + aliases
  end

  option(name, **o_params) do |_, v|
    send("#{options[:name]}=", v == true)
  end

  argument(name, **a_params) do |_, _|
    send("#{options[:name]}=", true)
  end
end