module WrapIt::Enums

Adds enums functionality

@author Alexey Ovchinnikov <alexiss@cybernetlab.ru>

Public Class Methods

included(base) click to toggle source
# File lib/wrap_it/enums.rb, line 16
def self.included(base)
  base == Base || fail(
    TypeError,
    "#{self.class.name} can be included only into WrapIt::Base"
  )
  base.class_eval do
    extend ClassMethods

    before_initialize { @enums = {} }

    before_capture do
      self.class.collect_derived(:@enums, {}, :merge).each do |name, e|
        next unless e.key?(:default) && !@enums.key?(name)
        send("#{name}=", e[:default])
      end
    end
  end
end

Private Class Methods

setter(name, &block) click to toggle source
# File lib/wrap_it/enums.rb, line 112
def self.setter(name, &block)
  ->(value) do
    opts = self.class.collect_derived(:@enums, {}, :merge)[name]
    v = value if opts[:values].include?(value)
    v ||= opts[:default] if opts.key?(:default)
    @enums[name] = v
    block.nil? || instance_exec(v, &block)
    if opts.key?(:regexp)
      html_class.delete(opts[:regexp])
      v.nil? || html_class << "#{opts[:html_class_prefix]}#{v}"
    end
  end
end