From: Lionel Thiry Date: 2006-02-08T08:48:21+09:00 Subject: Re: Meta-Meta-Programming http://www.rcrchive.net/rcr/show/321 Erik Veenstra a �crit : > > 1 class Module > 2 def just_wrap(method_name) > 3 wrap_method(method_name) do |org_method, args, block| > 4 org_method.call(*args, &block) > 5 end > 6 end > 7 end > 8 class Foo > 9 def bar(x, y, z) > 10 p [x, y, z] > 11 end > 12 just_wrap :bar # !!!!! > 13 end > 14 Foo.new.bar("a", "b", "c") # ===> ["a", "b", "c"] > class Foo def bar(x, y, z) p [x, y, z] end end cut JustWrap < Foo def bar super end end > > 1 class Module > 2 def big_arguments(method_name) > 3 wrap_method(method_name) do |org_method, args, block| > 4 args = args.collect{|x| x.to_s.upcase} > 5 org_method.call(*args, &block) > 6 end > 7 end > 8 end > 9 class Foo > 10 def bar(x, y, z) > 11 [x, y, z] > 12 end > 13 big_arguments :bar > 14 end > 15 Foo.new.bar("a", "b", "c") # ===> ["A", "B", "C"] > class Foo def bar(x, y, z) p [x, y, z] end end cut BigArguments < Foo def bar(*args) super(*args.collect{|x| x.to_s.upcase}) end end > > 1 class Module > 2 def find_nil(method_name) > 3 wrap_method(method_name) do |org_method, args, block| > 4 if args.include?(nil) > 5 $stderr.puts "Found a nil when called from #{caller[1..-1].inspect}." > 6 end > 7 org_method.call(*args, &block) > 8 end > 9 end > 10 end > 11 class Foo > 12 def bar(x, y, z) > 13 end > 14 find_nil :bar > 15 end > 16 Foo.new.bar("a", "b", "c") # ===> > 17 Foo.new.bar("a", "b", nil) # ===> Found a nil when called from from ["test.rb:17"]. > 18 Foo.new.bar("a", "b", "c") # ===> > class Foo def bar(x, y, z) end end cut FindNil < Foo def bar(*args) if args.include?(nil) $stderr.puts "Found a nil when called from #{caller[1..-1].inspect}." end super(*args) end end -- Lionel Thiry Personal web site: http://users.skynet.be/lthiry/