Class: KWAttr

Inherits:
Module show all
Defined in:
lib/kwattr.rb

Constant Summary collapse

VERSION =
"1.2.0"

Instance Method Summary collapse

Methods inherited from Module

#kwattr

Constructor Details

#initializeKWAttr

Returns a new instance of KWAttr.



4
5
6
7
# File 'lib/kwattr.rb', line 4

def initialize
  @required = []
  @defaults = {}
end

Instance Method Details

#initializer(attrs, opts) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/kwattr.rb', line 9

def initializer(attrs, opts)
  required_attrs = @required
  defaults = @defaults
  required_attrs.concat(attrs).uniq!
  defaults.merge!(opts)
  iv_cache = Hash.new { |h, k| h[k] = :"@#{k}" }

  verbose, $VERBOSE = $VERBOSE, false
  define_method :initialize do |*args, **kwargs, &block|
    required = required_attrs.dup

    defaults.merge(kwargs).each_pair do |key, value|
      next unless required.delete(key) || defaults.key?(key)
      kwargs.delete(key)
      instance_variable_set iv_cache[key], value
    end

    unless required.empty?
      super_required = []
      initialize = method(:initialize)
      initialize.super_method.parameters.each do |type, name|
        super_required << name if type == :keyreq && !kwargs.key?(name)
      end
      required.unshift(*super_required)
      raise ArgumentError,
        "missing keyword#{'s' if required.size > 1}: #{KWAttr.keywords_for_error(required).join(', ')}"
    end


    begin


      if kwargs.empty?
        super(*args, &block) else super(*args, **kwargs, &block)
      end

    rescue ArgumentError
      arity = method(:initialize).super_method.arity
      if !kwargs.empty? && arity != -1 && arity == args.size
        raise ArgumentError,
          "unknown keyword#{'s' if kwargs.size > 1}: #{KWAttr.keywords_for_error(kwargs.keys).join(', ')}"
      end
      raise
    end
  end
  $VERBOSE = verbose
end

#inspectObject



57
58
59
# File 'lib/kwattr.rb', line 57

def inspect
  "<KWAttr:#{'%#016x'%(object_id<<1)} @required=#{@required.inspect}, @defaults=#{@defaults.inspect}>"
end

#keywords_for_error(keywords) ⇒ Object



64
65
66
# File 'lib/kwattr.rb', line 64

def keywords_for_error(keywords)
  keywords.map(&:inspect)
end