Hi, > def map_messages( *args ) > args.map{ | message_and_args | > m = Array === message_and_args ? message_and_args : [ > message_and_args ] > send *m > } > end > > "abcd".map_messages( [ :[], 1, 2], :size ) > end At least in Ruby 1.8.6 (the version I've installed) you dont need to test if it's an Array. puts *[1] # 1 puts *1 # 1 Supposing that 1.9 maintains that behaviour, I propose the following: class Object def map_messages(*args) args.map{ |msg_and_args| send *msg_and_args } end def map_messages_with_block(*args) args.map do |msg| if !msg.is_a?(Array) || !msg.last.is_a?(Proc) send(*msg) else send(*msg[0...-1], &msg.last) end end end end Obvious map_messages_with_block has a performance penalty, that's why I kept both. puts "abcd".map_messages([:[], 1, 2], :upcase, :downcase).inspect blk = Proc.new{ |obj| obj.map_messages([:[], 1, 2], :upcase, :downcase)} puts ["abcd", "bcde"].map_messages_with_block([:each, blk], [:[], 1]).inspect Tell me what you think about it. Pedro. -- Posted via http://www.ruby-forum.com/.