Class methods in a module?

At Scotland On Rails a few months ago, I was shown a nice way to put
class methods in a module, alongside instance methods, in such a way as
they will get added as class methods automatically, without any work
required on the part of the person including the module.

Unfortunately i failed to make a note of how to do this and i've since
forgotten. Can anyone show me?

It was something along these lines...(the following doesn't work btw)

module Mappable

   #instance methods
   def foo
     "foo"
   end

   #class methods
   class << self.class
     def bar
       "bar"
     end
   end

end

can anyone set me straight?
thanks
max

···

--
Posted via http://www.ruby-forum.com/.

I'm not sure if you can pick up the singleton methods from the module and
automatically copy them to the class -- I've got type errors before when
trying to move and rebind methods. I did come up with this, though, which is
more expressive than writing an included() hook on every module:

···

2009/5/25 Max Williams <toastkid.williams@gmail.com>

At Scotland On Rails a few months ago, I was shown a nice way to put
class methods in a module, alongside instance methods, in such a way as
they will get added as class methods automatically, without any work
required on the part of the person including the module.

Unfortunately i failed to make a note of how to do this and i've since
forgotten. Can anyone show me?

The usual way is to use the hook method Module#included, something like:

module Mappable

  #instance methods
  def foo
    "foo"
  end

  #class methods
  module ClassMethods
    def bar
      "bar"
    end
  end

  def self.included(other)
     other.extend(ClassMethods)
  end
end

By the way this nesting of a Module inside a module is another variant
on something discussed in another recent ruby-talk thread.

···

On Mon, May 25, 2009 at 11:07 AM, Max Williams <toastkid.williams@gmail.com> wrote:

At Scotland On Rails a few months ago, I was shown a nice way to put
class methods in a module, alongside instance methods, in such a way as
they will get added as class methods automatically, without any work
required on the part of the person including the module.

Unfortunately i failed to make a note of how to do this and i've since
forgotten. Can anyone show me?

It was something along these lines...(the following doesn't work btw)

module Mappable

#instance methods
def foo
"foo"
end

#class methods
class << self.class
def bar
"bar"
end
end

end

can anyone set me straight?
thanks
max

--
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale

Max Williams wrote:

At Scotland On Rails a few months ago, I was shown a nice way to put
class methods in a module, alongside instance methods, in such a way as
they will get added as class methods automatically, without any work
required on the part of the person including the module.

Unfortunately i failed to make a note of how to do this and i've since
forgotten. Can anyone show me?

It was something along these lines...(the following doesn't work btw)

module Stuff
   module ClassMethods
     def biff(*args)
       # ...
     end

     def baz(*args)
       # ...
     end
   end

   def self.included(base)
     base.extend(ClassMethods)
   end

end

The methods defined in Stuff::ClassMethods are added as class methods when

   include Stuff

is called

···

--
James Britt

www.jamesbritt.com - Playing with Better Toys
www.ruby-doc.org - Ruby Help & Documentation
www.rubystuff.com - The Ruby Store for Ruby Stuff
www.neurogami.com - Smart application development