Module: Blocks::DynamicConfiguration::ClassMethods

Defined in:
lib/blocks/utilities/dynamic_configuration.rb

Instance Method Summary collapse

Instance Method Details

#add_config(*attrs) ⇒ Object



6
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
62
63
64
# File 'lib/blocks/utilities/dynamic_configuration.rb', line 6

def add_config(*attrs)
  options = attrs.extract_options!
  instance_reader = options.fetch(:instance_accessor, true) && options.fetch(:instance_reader, true)
  instance_writer = options.fetch(:instance_accessor, true) && options.fetch(:instance_writer, true)
  instance_predicate = options.fetch(:instance_predicate, true)
  default_value = options.fetch(:default, nil)

  attrs.each do |name|
    define_singleton_method(name) do |value="UNDEFINED"|
      if value == "UNDEFINED"
        default_value
      else
        public_send("#{name}=", value)
      end
    end
    define_singleton_method("#{name}?") { !!public_send(name) } if instance_predicate

    ivar = "@#{name}"

    define_singleton_method("#{name}=") do |val|
      singleton_class.class_eval do
        remove_possible_method(name)
        define_method(name) do |value="UNDEFINED"|
          if value == "UNDEFINED"
            val
          else
            public_send("#{name}=", value)
          end
        end
      end

      class_eval do
        remove_possible_method(name)
        define_method(name) do
          if instance_variable_defined? ivar
            instance_variable_get ivar
          else
            singleton_class.send name
          end
        end
      end
      val
    end

    if instance_reader
      remove_possible_method name
      define_method(name) do
        if instance_variable_defined?(ivar)
          instance_variable_get ivar
        else
          self.class.public_send name
        end
      end
      define_method("#{name}?") { !!public_send(name) } if instance_predicate
    end

    attr_writer name if instance_writer
  end
end

#configure {|_self| ... } ⇒ Object

Yields:

  • (_self)

Yield Parameters:



66
67
68
# File 'lib/blocks/utilities/dynamic_configuration.rb', line 66

def configure
  yield self
end