Module: LittleGhost::Support::ClassAttributes

Included in:
Agent, Tool
Defined in:
lib/little_ghost/support/class_attributes.rb

Overview

ClassAttributes gives framework extension classes small, thread-safe, inheritable settings. A subclass inherits a value until it assigns its own; mutable defaults are not duplicated automatically.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object

:nodoc:



9
10
11
# File 'lib/little_ghost/support/class_attributes.rb', line 9

def self.included(base) # :nodoc:
  base.extend(self)
end

Instance Method Details

#class_attribute(*names, default: nil) ⇒ Object

Defines thread-safe singleton readers and writers for names.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/little_ghost/support/class_attributes.rb', line 14

def class_attribute(*names, default: nil)
  names.each do |name|
    unless name.is_a?(String) || name.is_a?(Symbol)
      raise TypeError, "#{name.inspect} is not a symbol nor a string"
    end

    name = name.to_sym
    singleton_class.remove_method(name) if singleton_class.method_defined?(name, false)
    writer = :"#{name}="
    singleton_class.remove_method(writer) if singleton_class.method_defined?(writer, false)
    values = {self => default}
    mutex = Mutex.new
    define_singleton_method(name) do
      found, value = mutex.synchronize { [values.key?(self), values[self]] }
      return value if found

      superclass.public_send(name)
    end
    define_singleton_method(writer) do |value|
      mutex.synchronize { values[self] = value }
      value
    end
  end
end