Sha256: 73fb7f04db57fa3da2c395df2b6171a8c4997c9f815e57b41d92ba5960c4d1d8

Contents?: true

Size: 1.48 KB

Versions: 1

Compression:

Stored size: 1.48 KB

Contents

require 'justools/core_ext/array/merge_options'

module Juscribe
  ARGS_AND_OPTS_REGEXP = /^#{%w(arg(?:ument)?s opt(?:ion)?s).
                             zip(Array.new(2, "(?:_with_(\\w+))?")).
                             map(&:join) * '_and_'}!?$/
end

class Array
  unless Array.instance_methods.include?(:rotate) # Was only patch for 1.8
    def rotate
      self[0..-2].unshift(self[-1])
    end
  end
  
  def arguments_and_options(update_hash = {})
    merge_options(update_hash).args_and_opts!
  end
  
  def arguments_and_options!(update_hash = {})
    [extract_options_with_merge!(update_hash), self].rotate
  end
  
  [:args_and_opts!, :args_and_opts_with_merge!,
                    :arguments_and_options_with_merge!].each do |meth|
    alias_method meth,                    :arguments_and_options!
    alias_method meth.to_s[0..-2].to_sym, :arguments_and_options
  end
  
  # Method#parameters only available in Ruby 1.9+  
  if RUBY_VERSION > '1.9'  
    private 
    def method_missing(method_symbol, *args, &block)
      return super unless method_symbol =~ Justools::ARGS_AND_OPTS_REGEXP
    
      [$1, $2].zip(args_and_opts).map do |m, obj|
        next if m.respond_to?(:empty?) ? empty? : !m
        obj.send(m.to_sym, *args.send(:constrained_by_method, obj.method(m.to_sym)))
      end
    end
    
    def constrained_by_method(methud)    
      methud.parameters.detect { |t, _| t == :rest } or return self
      take([methud.parameters.size, methud.arity.abs].max)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
justools-1.2.2 lib/justools/core_ext/array/args_and_opts.rb