------art_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 <fxn / hashref.com> 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
>
>
>
>

------art_29973_4303716.1179347973602--