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. | 
			 
			
				 | 
			 
		  | 
	 
	 
		 | 
		
		 | 
	 
	  
		  | 
	 
				 
		 | 
	 
 
	
	
	 
	
	 |