module Structure::ClassMethods
The class interface
Attributes
attribute_names[R]
Private Class Methods
extended(base)
click to toggle source
# File lib/structure.rb, line 86 def extended(base) base.instance_variable_set :@attribute_names, [] base.send :override_initialize end
Public Instance Methods
attribute(name, &block)
click to toggle source
# File lib/structure.rb, line 94 def attribute(name, &block) name = name.to_s if name.end_with?('?') name = name.chop module_eval <<-CODE, __FILE__, __LINE__ + 1 def #{name}? #{name} end CODE end module_eval <<-CODE, __FILE__, __LINE__ + 1 def #{name} with_mutex do break if defined?(@#{name}) @#{name} = unmemoized_#{name} end @#{name} end CODE private define_method "unmemoized_#{name}", block @attribute_names << name name.to_sym end
Private Instance Methods
inherited(subclass)
click to toggle source
# File lib/structure.rb, line 147 def inherited(subclass) subclass.instance_variable_set :@attribute_names, attribute_names.dup end
method_added(name)
click to toggle source
# File lib/structure.rb, line 143 def method_added(name) override_initialize if name == :initialize end
override_initialize()
click to toggle source
# File lib/structure.rb, line 125 def override_initialize class_eval do unless method_defined?(:overriding_initialize) define_method :overriding_initialize do |*arguments, &block| @mutex = ::Thread::Mutex.new original_initialize(*arguments, &block) end end return if instance_method(:initialize) == instance_method(:overriding_initialize) alias_method :original_initialize, :initialize alias_method :initialize, :overriding_initialize private :overriding_initialize, :original_initialize end end