On 5/16/07, Dave Hoefler <dhoefler / gmail.com> 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).
This is the doc about #include not #included!!
>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.
>
> Thanks,
> Dave
>

The included hook is run whenever a module is included.
The parameter base passed to the hook is referring to the class into
which the module is included.
Basically
 def self.included(base)
   base.extend(ClassMethods)
 end
means:
and if you include me you also extend your class to all methods
defined in ClassMethods.

This means that instead of writing

class X
   include Y
   extend ClassMethods
end

you write
class X
   include Y # ==> the hook does X.extend(ClassMethods)
end

Although I do not know Rails it might be a reasonable guess that the
functionality of ClassMethods is closely coupled with the
functionality of the inserted module - and that methods of the module
need class methods from ClassMethods.

HTH
Robert


-- 
You see things; and you say Why?
But I dream things that never were; and I say Why not?
-- George Bernard Shaw