Issue #9552 has been updated by Boris Stitnicky.


I failed to notice that `Method#parameters` was already available. This makes it possible for me to implement my desired `Module#map!` and other metaprogramming without asking for novel core syntax. The reasons supporting this feature suggestion are thus much weaker than I thougt.

----------------------------------------
Feature #9552: Module map!
https://bugs.ruby-lang.org/issues/9552#change-45403

* Author: Boris Stitnicky
* Status: Open
* Priority: Normal
* Assignee: 
* Category: 
* Target version: 
----------------------------------------
I would like to beg for `map!` directive in `Module`. I can imitate it with this code:

```ruby
class Module
  def map! **hash, &block
    hash.each_pair { |mapped_method_symbol, original_method_symbol|
      define_method mapped_method_symbol do |*args, &b|
        block.( send original_method_symbol, *args, &b )
      end
    }
  end
end
```

And then

```ruby
class Foo; attr_accessor :name end
class Bar; attr_accessor :name end
class Baz; attr_accessor :name end

class FooBarBazCollection < Array
  def foos; select { |e| e.is_a? Place } end
  def bars; select { |e| e.is_a? Transition } end
  def bazs; select { |e| e.is_a? Arc } end
  map! fn: :foos, barn: :bars, bazn: :bazs do |retval| retval.map &:name end
end
```

I solemnly declare that I have encountered this pattern in my work on Petri net gem sufficiently many times to warrant this meta approach. The above method `#map!` is not perfect, because it makes the "mapped" methods more omnivorous -- accepting even such sets of arguments, for which the originals returned `ArgumentError`. I do not know how to solve this without asking for a core-level solution.



-- 
http://bugs.ruby-lang.org/