Module: AttrExtras::ClassMethods

Included in:
Class
Defined in:
lib/attr_extras.rb

Instance Method Summary collapse

Instance Method Details

#attr_id_query(*names) ⇒ Object



58
59
60
# File 'lib/attr_extras.rb', line 58

def attr_id_query(*names)
  attr_query_with_suffix(*names, "_id")
end

#attr_initialize(*names) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/attr_extras.rb', line 5

def attr_initialize(*names)
  min_arity = names.count { |n| not n.is_a?(Array) }
  max_arity = names.length

  define_method(:initialize) do |*values|
    provided_arity = values.length

    unless (min_arity..max_arity).include?(provided_arity)
      arity_range = [min_arity, max_arity].uniq.join("..")
      raise ArgumentError, "wrong number of arguments (#{provided_arity} for #{arity_range})"
    end

    names.zip(values).each do |name_or_names, value|
      if name_or_names.is_a?(Array)
        value ||= {}

        name_or_names.each do |key|
          instance_variable_set("@#{key}", value[key])
        end
      else
        instance_variable_set("@#{name_or_names}", value)
      end
    end
  end
end

#attr_private(*names) ⇒ Object



31
32
33
34
# File 'lib/attr_extras.rb', line 31

def attr_private(*names)
  attr_reader(*names)
  private(*names)
end

#attr_query(*names) ⇒ Object



54
55
56
# File 'lib/attr_extras.rb', line 54

def attr_query(*names)
  attr_query_with_suffix(*names, "")
end

#attr_value(*names) ⇒ Object



41
42
43
44
# File 'lib/attr_extras.rb', line 41

def attr_value(*names)
  attr_initialize(*names)
  attr_reader(*names.flatten)
end

#method_object(method_name, *names) ⇒ Object



46
47
48
49
50
51
52
# File 'lib/attr_extras.rb', line 46

def method_object(method_name, *names)
  singleton_class.send(:define_method, method_name) do |*values|
    new(*values).send(method_name)
  end

  pattr_initialize(*names)
end

#pattr_initialize(*names) ⇒ Object



36
37
38
39
# File 'lib/attr_extras.rb', line 36

def pattr_initialize(*names)
  attr_initialize(*names)
  attr_private(*names.flatten)
end