Sha256: 59244a9f0ada90f9ed2bd51f9fffe1951570e6a4fe4c89cb290aa2508978d02e

Contents?: true

Size: 1.17 KB

Versions: 2

Compression:

Stored size: 1.17 KB

Contents

module ROM
  module AutoCurry
    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

    def auto_curry_guard
      @__auto_curry_busy__ = true
      yield
    ensure
      @__auto_curry_busy__ = false
    end

    def auto_curry_busy?
      @__auto_curry_busy__ ||= false
    end

    def auto_curried_methods
      @__auto_curried_methods__ ||= []
    end

    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
      end

      auto_curried_methods << name

      prepend(mod)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rom-core-4.0.0.beta2 lib/rom/auto_curry.rb
rom-core-4.0.0.beta1 lib/rom/auto_curry.rb