Module: Attribute::Define

Extended by:
Define
Included in:
Define
Defined in:
lib/attribute/define.rb

Instance Method Summary collapse

Instance Method Details

#call(target_class, attr_name, visibility = nil, check: nil, &initialize_value) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
# File 'lib/attribute/define.rb', line 5

def call(target_class, attr_name, visibility=nil, check: nil, &initialize_value)
  visibility ||= :reader

  if [:reader, :accessor].include? visibility
    define_reader(target_class, attr_name, visibility, check, &initialize_value)
  end

  if [:writer, :accessor].include? visibility
    define_writer(target_class, attr_name, visibility, check, &initialize_value)
  end

  attr_name
end

#define_reader(target_class, attr_name, visibility, check, &initialize_value) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/attribute/define.rb', line 20

def define_reader(target_class, attr_name, visibility, check, &initialize_value)
  attr_name = :"#{attr_name}" unless attr_name.is_a? Symbol
  var_name = "@#{attr_name}"
  target_class.send :define_method, attr_name do
    val = instance_variable_get(var_name)

    if val.nil?
      if initialize_value
        val = initialize_value.()
        instance_variable_set var_name, val
      end
    end

    if check
      check.(val)
    end

    val
  end
end

#define_writer(target_class, attr_name, visibility, check, &initialize_value) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/attribute/define.rb', line 41

def define_writer(target_class, attr_name, visibility, check, &initialize_value)
  attr_name = :"#{attr_name}" unless attr_name.is_a? Symbol
  writer_name = :"#{attr_name}="
  var_name = "@#{attr_name}"
  target_class.send :define_method, writer_name do |val|
    if check
      check.(val)
    end

    instance_variable_set var_name, val
  end
end