From: Dave Hoefler Date: 2007-05-17T05:39:35+09:00 Subject: Re: self.included question ------=_Part_29973_4303716.1179347973602 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Robert and Xavier (fxn) - Thank you for the explanations! That just cleared things up tremendously. So say I have this module (rails plugin): module Office def self.included(base) base.extend(ClassMethods) end module ClassMethods def working(options={}) # do something based off the options end end end In one of my models I can then access the method 'working' by: class ModelName < ActiveRecord::Base working :task => "Take a break!" end Thanks again -Dave On 5/16/07, Xavier Noria wrote: > > On May 16, 2007, at 10:02 PM, Dave Hoefler wrote: > > > Hi there, > > > > I see the following code chunk in a lot of Rails plugins: > > > > def self.included(base) > > base.extend(ClassMethods) > > end > > > > module ClassMethods > > def method_one > > end > > > > def method_two > > end > > end > > > > > > I'm most curious about "self.included". I checked out the docs on > > 'included' > > (http://www.ruby-doc.org/core/classes/Module.html#M001661). They > > pointed to > > 'Module.append_features' ( > > http://www.ruby-doc.org/core/classes/Module.html#M001659). Even after > > reading the docs, I'm still a little lost. Could someone break it > > down a > > little more than the docs? ...or point me at some other resource. > > I'd like > > to know "why" this is done. > > If a module implements self.included the interpreter calls that > method whenever the module is included in another module or class, > which is passed as its single argument. > > Object#extend on the other hand adds the instance methods of the > module or modules passed as arguments to the target object (as > singleton methods). If the object is a class, that means you are > making module instance methods available as class methods in that > class, and that's what base is when a module is being included in a > class. > > In short, plugins put methods that will end up being class methods > (acts_as_something, say) in their own nested module, conventionally > called ClassMethods, and then include them in init.rb. For instance > > ActiveRecord::Base.send(:include, MyModule) > > That triggers inclusion when Rails boots, so your code is able to > call those class methods as if they belonged to the original API of > ActiveRecord::Base (in the example). > > -- fxn > > > > ------=_Part_29973_4303716.1179347973602--