class ContextBuilder::BaseClassDefiner

Attributes

base_class[R]

Public Class Methods

new(base_class) click to toggle source
# File lib/context_builder/base_class_definer.rb, line 6
def initialize(base_class)
  @base_class = base_class
end

Public Instance Methods

define_all(all_attrs) click to toggle source
# File lib/context_builder/base_class_definer.rb, line 10
def define_all(all_attrs)
  define_initialize_context_method(all_attrs)
  define_all_attr_methods(all_attrs)
  define_context_method(all_attrs)
  define_to_hash_method(all_attrs)
  define_inspect_method(all_attrs)
end

Private Instance Methods

define_all_attr_methods(all_attrs) click to toggle source
# File lib/context_builder/base_class_definer.rb, line 29
def define_all_attr_methods(all_attrs)
  all_attrs.keys.each do |name|
    base_class.send(:define_method, name) do
      @__context ||= {}
      @__context[name] ||= [self.class, *self.class.included_modules].reduce(nil) do |val, mod|
        val ||= begin
          if mod.method_defined? "lookup_#{name}"
            mod.instance_method("lookup_#{name}").bind(self).call
          end
        end
      end
    end
  end
end
define_context_method(all_attrs) click to toggle source
# File lib/context_builder/base_class_definer.rb, line 44
def define_context_method(all_attrs)
  base_class.send(:define_method, :context) do
    all_attrs.keys.reduce({}) do |hash, name|
      hash.merge! name => send(name)
    end
  end
end
define_initialize_context_method(all_attrs) click to toggle source
# File lib/context_builder/base_class_definer.rb, line 20
def define_initialize_context_method(all_attrs)
  base_class.send(:define_method, :initialize_context) do |options|
    all_attrs.each do |name, block|
      @__context ||= {}
      @__context[name] = block ? block.call(options) : options[name]
    end
  end
end
define_inspect_method(all_attrs) click to toggle source
# File lib/context_builder/base_class_definer.rb, line 58
def define_inspect_method(all_attrs)
  base_class.send(:define_method, :inspect) do
    data = to_hash.map { |a| a.join '=' }.join ', '
    "#<#{self.class.name} #{data}>"
  end
end
define_to_hash_method(all_attrs) click to toggle source
# File lib/context_builder/base_class_definer.rb, line 52
def define_to_hash_method(all_attrs)
  base_class.send(:define_method, :to_hash) do
    context
  end
end