From: "Jesús Gabriel y Galán" Date: 2010-06-14T17:22:40+09:00 Subject: Re: Metaprograming On Mon, Jun 14, 2010 at 7:23 AM, Sateesh Kambhamapati wrote: > Jesús Gabriel y Galán wrote: >> On Thu, Jun 10, 2010 at 11:53 AM, Sateesh Kambhamapati >> wrote: >>> end >>> end >>> f=flower.new >>> f.rose-------------------->It gives me rose >>> but now f.jasmine------------------->It calls method_missing >>> but i want it comes to my class "Flower" >> >> I'm not sure if I understand you correctly, but if you want those >> method missing calls, to be called on the Flower class, you can do >> this: >> >> irb(main):001:0> class Flower >> irb(main):002:1> def self.jasmine >> irb(main):003:2> "jasmine" >> irb(main):004:2> end >> irb(main):005:1> def method_missing meth, *args, &blk >> irb(main):006:2> self.class.send meth, *args, &blk >> irb(main):007:2> end >> irb(main):008:1> end >> => nil >> irb(main):016:0> Flower.new.jasmine >> => "jasmine" >> >>> So i Want to know which methods are invoked by my "Flower" object >> >> I don't understand this question. >> >> Jesus. > > Thanks for reply > i would like to know which methods are called by class object i.e > class Flower >     def jasmine >     puts "iam jasmine" >   end >      def rose >      puts "iam rose" >  end > end > > flowerlist=Flower.new #----->Creating instance for flower > flowerlist.jasmine  #------->"gives output as "iam jasmine" > flowerlist.rose  # =======> "gives output as "i am rose" > flowerlist.lotus   #------->"Shows No Method Error" > > Question : --> My Question is i would like to know which methods are > called by object i.e flowerlist  in the class Flower > > if i already know those methods then > suppose if i have not define some method then i will define it > dynamically example here is "lotus" > > i think u understand my question As I understand the question now, I think the answer from Phrogz is spot on. You need to use the method_missing method, which will catch any call to a method you haven't defined: class Flower def jasmine puts "iam jasmine" end def rose puts "iam rose" end def method_missing meth, *args, &blk puts "method #{meth} called, but not defined" end end flowerlist=Flower.new #----->Creating instance for flower flowerlist.jasmine #------->"gives output as "iam jasmine" flowerlist.rose # =======> "gives output as "i am rose" flowerlist.lotus #=> "method lotus called, but not defined" So, now you know where you have a place to do whatever you want to do with a call to a method that doesn't exist. For example, if you want to dynamically create a method that returns its name as a string, you can do: def method_missing method, *args, &blk self.class.send(:define_method, method) do method.to_s end send(method) end This will dynamically define (and call) a method that returns its name as a string. So if you add that to the Flower class: class Flower def method_missing method, *args, &blk self.class.send(:define_method, method) do method.to_s end send(method) end end f = Flower.new f.lotus #=> "lotus" f.rose #=> "rose" and so on. In any case, I recommend looking at Phrogz's answer, because it's a nice little utility to automatically define method that do different things depending the the name patterns. Regards, Jesus.