| The magical each_* solution! 
 
	 
	
		| Author | Message |   
		| wtd 
 
 
 
 
 | 
			
				|  Posted: Tue Jul 03, 2007 6:21 pm    Post subject: The magical each_* solution! |  |   
				| 
 |  
				| 	  | code: |  	  | class Object
def method_missing(msg, *args)
 if (msg.to_s =~ /^each_([a-z][a-z\d_]*)$/i and method_name = $1.to_sym) and ((respond_to? method_name and begin (c = send method_name, *args).respond_to? :each rescue false end) or (respond_to? :"#{method_name}s" and begin (c = send :"#{method_name}s", *args).respond_to? :each rescue false end))
 c.each { |x| yield x }
 else
 super
 end
 end
 end
 | 
 
 
 	  | code: |  	  | $ irb --prompt simple
>> class Foo
 >>     def bar
 >>         [1, 2, 3]
 >>     end
 >> end
 => nil
 >> Foo.new.each_bar { |x| puts x }
 1
 2
 3
 => [1, 2, 3]
 >>
 | 
 |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| Sponsor Sponsor
 
  
   |  |   
		|  |   
		| wtd 
 
 
 
 
 | 
			
				|  Posted: Wed Jul 04, 2007 12:31 am    Post subject: Re: The magical each_* solution! |  |   
				| 
 |  
				| This code appears not to work, and I have very little idea why not.  Anyone want to take a crack at it? 
 
 	  | code: |  	  | class Object
def method_missing(msg, *args)
 msg.to_s =~ /^each_([a-z][a-z\d_]*)$/i and method_name = $1.to_sym and c = (respond_to_and_enumerable(method_name, *args) or respond_to_and_enumerable(:"#{method_name}s", *args)) ? c.each { |x| yield x } : super
 end
 
 def respond_to_and_enumerable(msg, *args)
 (result = send msg, *args).respond_to? :each and result
 rescue ArgumentError
 false
 end
 end
 | 
 |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| wtd 
 
 
 
 
 | 
			
				|  Posted: Wed Jul 04, 2007 12:49 am    Post subject: RE:The magical each_* solution! |  |   
				| 
 |  
				| Fixed! 
 
 	  | code: |  	  | class Object
def method_missing(msg, *args)
 (msg.to_s =~ /^each_([a-z][a-z\d_]*)$/i and method_name = $1.to_sym and c = (respond_to_and_enumerable method_name, *args or respond_to_and_enumerable :"#{method_name}s", *args)) ? c.each { |x| yield x } : super
 end
 
 def respond_to_and_enumerable(msg, *args)
 (result = send msg, *args).respond_to? :each and result
 rescue ArgumentError
 false
 end
 end
 | 
 |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| wtd 
 
 
 
 
 | 
			
				|  Posted: Wed Jul 04, 2007 12:52 am    Post subject: RE:The magical each_* solution! |  |   
				| 
 |  
				| And one more slightly different version: 
 
 	  | code: |  	  | class Object
def method_missing(msg, *args)
 msg.to_s =~ /^each_([a-z][a-z\d_]*)$/i and method_name = $1.to_sym and c = (respond_to_and_enumerable method_name, *args or respond_to_and_enumerable :"#{method_name}s", *args) and c.each { |x| yield x } or super
 end
 
 def respond_to_and_enumerable(msg, *args)
 (result = send msg, *args).respond_to? :each and result
 rescue ArgumentError
 false
 end
 end
 | 
 |  
				|  |  |   
		|  |  |  
	  
		|  |   
		| Cervantes 
 
  
 
 
 | 
			
				|  Posted: Wed Jul 04, 2007 10:07 am    Post subject: RE:The magical each_* solution! |  |   
				| 
 |  
				| Nice, wtd. I do so love method_missing. I was thinking of something similar, well, about a year ago. I should really try to implement it. |  
				|  |  |   
		|  |  |  
	  
		|  |   
		|  |  
 |