module ROM::AutoCurry

Relation extension which provides auto-currying of relation view methods

@api private

Public Class Methods

extended(klass) click to toggle source
Calls superclass method
# File lib/rom/auto_curry.rb, line 8
def self.extended(klass)
  klass.define_singleton_method(:method_added) do |name|
    return if auto_curry_busy?

    auto_curry_guard { auto_curry(name) }
    super(name)
  end
end

Public Instance Methods

auto_curried_methods() click to toggle source

@api private

# File lib/rom/auto_curry.rb, line 31
def auto_curried_methods
  @__auto_curried_methods__ ||= Set.new
end
auto_curry(name, &block) click to toggle source

Auto-curry a method

@param [Symbol] name The name of a method

@api private

Calls superclass method
# File lib/rom/auto_curry.rb, line 40
def auto_curry(name, &block)
  arity = instance_method(name).arity

  return unless public_instance_methods.include?(name) && arity != 0

  mod = Module.new

  mod.module_eval do
    define_method(name) do |*args, &mblock|
      response =
        if arity < 0 || arity == args.size
          super(*args, &mblock)
        else
          self.class.curried.new(self, view: name, curry_args: args, arity: arity)
        end

      if block
        response.instance_exec(&block)
      else
        response
      end
    end
    ruby2_keywords(name) if respond_to?(:ruby2_keywords, true)
  end

  auto_curried_methods << name

  prepend(mod)
end
auto_curry_busy?() click to toggle source

@api private

# File lib/rom/auto_curry.rb, line 26
def auto_curry_busy?
  @__auto_curry_busy__ ||= false
end
auto_curry_guard() { || ... } click to toggle source

@api private

# File lib/rom/auto_curry.rb, line 18
def auto_curry_guard
  @__auto_curry_busy__ = true
  yield
ensure
  @__auto_curry_busy__ = false
end