module MemoAttr::ClassMethods

Public Instance Methods

memo_attr(name, &block) click to toggle source
# File lib/jobshop/support/memo_attr.rb, line 12
def memo_attr(name, &block)
  raise LocalJumpError.new('no block given') unless block_given?

  instance_eval { define_memoized_method(name, &block) }
  class_eval    { define_validation_block(name) }
end

Private Instance Methods

define_memoized_method(name, &block) click to toggle source
# File lib/jobshop/support/memo_attr.rb, line 20
def define_memoized_method(name, &block)
  define_method(name) do
    __memoized.fetch(name) { |k| __memoized[k] = instance_eval(&block) }
  end
end
define_validation_block(name) click to toggle source
# File lib/jobshop/support/memo_attr.rb, line 26
def define_validation_block(name)
  validate do
    send(name).errors.each do |key, value|
      errors.add("#{send(name).class.name.underscore}_#{key}", value)
    end unless send(name).valid?
  end
end