## Based on map_by_method 0.7.0
module MapByMethod
MAP_BY_METHOD_FORMAT = /^(map|collect|select|each|reject)(?:_by)?_(\w+[?!]?)$/
module InstanceMethods
alias_method :respond_to_before_map_by_method?, :respond_to?
def respond_to?(method)
respond_to_before_map_by_method?(method) or
!!method.to_s.match(MAP_BY_METHOD_FORMAT)
end
protected
alias_method :method_missing_before_map_by_method, :method_missing
def method_missing(method, *args, &block)
if !respond_to_before_map_by_method?(method) and
(matches = method.to_s.match(MAP_BY_METHOD_FORMAT))
iterator, callmethod = matches[1..2]
# map by multiple stuff
result = callmethod.split('_and_').collect do |method|
self.send(iterator) { |item| item.send method }
end
return result.length > 1 ? result.transpose : result.first
else
method_missing_before_map_by_method(method, *args, &block)
end
end
end
def self.included(base)
super
base.send :include, InstanceMethods
end
end
Array.send :include, MapByMethod