1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Array
  def method_missing_with_magic_map(method, *args, &block)
    method_missing_without_magic_map(method, *args, &block)
  rescue NoMethodError
    error = $!
    begin
      re = /(map|collect|select|each|reject)_([\\w\\_]+\\??)/
      if (match = method.to_s.match(re))
        iterator, callmethod = match[1..2]
        return self.send(iterator) {|item| item.send callmethod}
      end
      return self.map {|item| item.send method.to_s.singularize.to_sym}
    rescue NoMethodError
      nil
    end
    raise error
  end

  alias_method :method_missing_without_magic_map, :method_missing
  alias_method :method_missing, :method_missing_with_magic_map
end

class String
  def method_missing_with_singularize(method, *args, &block)
    return self.gsub(/e?s\Z/,'') if method.to_s == "singularize"
    method_missing_without_singularize(method, *args, &block)
  end

  alias_method :method_missing_without_singularize, :method_missing
  alias_method :method_missing, :method_missing_with_singularize
end