Module: PropertyAccessor::ClassMethods

Included in:
PropertyAccessor
Defined in:
lib/property_accessor/class_methods.rb

Instance Method Summary collapse

Instance Method Details

#property(property_name, &block) ⇒ Object



7
8
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
56
57
58
59
60
61
# File 'lib/property_accessor/class_methods.rb', line 7

def property(property_name, &block)
  property = Property.new(property_name)
  builder = PropertyBuilder.new(property)

  if block.nil?
    raise UndefinedPropertyError, 'cannot define a property without specifying at least getter or setter'
  end

  builder.instance_exec(&block)

  define_method(property.initializer_method_name) do
    if !instance_variable_defined?(property.field_name)
      instance_variable_set(
        property.field_name,
        property.default_value_proc ?
          instance_exec(&property.default_value_proc) :
          property.default_value
      )
    end
  end

  private property.initializer_method_name

  if property.getter_defined?
    define_method(property.getter_method_name) do
      send(property.initializer_method_name)
      instance_exec(&property.getter_proc)
    end
  elsif property.default_getter
    define_method(property.getter_method_name) do
      send(property.initializer_method_name)
      instance_variable_get(property.field_name)
    end
  end

  if property.setter_defined?
    define_method(property.setter_method_name, property.setter_proc)
  elsif property.default_setter
    define_method(property.setter_method_name) do |val|
      instance_variable_set(property.field_name, val)
    end
  end

  property.private_method_names.each do |method_name|
    private method_name
  end

  property.protected_method_names.each do |method_name|
    protected method_name
  end

  property.public_method_names.each do |method_name|
    public method_name
  end
end