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