Module: LittleGhost::Support::ClassAttributes
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
-
.included(base) ⇒ Object
:nodoc:.
Instance Method Summary collapse
-
#class_attribute(*names, default: nil) ⇒ Object
Defines thread-safe singleton readers and writers for
names.
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 |