Mixin of class methods?

Hello all,

I'm a little bit new to the wonderful world of ruby and have a small
problem. I would like to mixin a module method:

  module M
    def M.foobar id
      puts "Hello Ruby: #{id}"
    end
  end

  class C
    include M
    foobar :example
  end

But that doesn't work. I'm trying to write some helper class methods
like attr_accessor and friends.

I don't like to write

  class C
    include M
    M.foobar :example
  end

because 'M' has to many chars to type...
My helper class methods should look like attr_accessor and friends.

What is the right way to solve this problem?

Michael Roth

module M
  def foobar(id)
    puts "Hello Ruby: #{id}"
  end
end

class C
  class << self
    include M
  end
  foobar :example
end

module M
   def foobar id
     puts "Hello Ruby: #{id}"
   end
end

class C
   extend M
   foobar :example
end

OR if you'd like M to have both instance and class methods:

module M
   def self.included(base)
     super
     base.extend ClassMethods
   end

   def baz
     # ...
   end

   module ClassMethods
     def foobar id
       # ...
     end
   end
end

class C
   include M
   foobar :example
end

C.new.baz

Modules are pleasant little beasts.

Best,
jeremy

···

On Sep 24, 2005, at 1:56 PM, Michael Roth wrote:

I'm a little bit new to the wonderful world of ruby and have a small
problem. I would like to mixin a module method:

  module M
    def M.foobar id
      puts "Hello Ruby: #{id}"
    end
  end

  class C
    include M
    foobar :example
  end

i think this is clearest for people reading your code:

   module M
     module InstanceMethods
     end
     module ClassMethods
     end
     def self::included other
       other.module_eval{ include InstanceMethods }
       other.extend ClassMethods
       other
     end
   end

   class C
     include M
   end

but it's an opinion...

-a

···

On Sun, 25 Sep 2005, Michael Roth wrote:

Hello all,

I'm a little bit new to the wonderful world of ruby and have a small
problem. I would like to mixin a module method:

module M
   def M.foobar id
     puts "Hello Ruby: #{id}"
   end
end

class C
   include M
   foobar :example
end

But that doesn't work. I'm trying to write some helper class methods
like attr_accessor and friends.

I don't like to write

class C
   include M
   M.foobar :example
end

because 'M' has to many chars to type...
My helper class methods should look like attr_accessor and friends.

What is the right way to solve this problem?

--

email :: ara [dot] t [dot] howard [at] noaa [dot] gov
phone :: 303.497.6469
Your life dwells amoung the causes of death
Like a lamp standing in a strong breeze. --Nagarjuna

===============================================================================

Kevin Ballard wrote:

class C
  class << self
    include M
  end
  foobar :example
end

Thank you very much.

Hmm, the 'class <<' thing creates an singleton class. Looks like I
should take some time to read some more pages from the ruby book...

Michael Roth

Jeremy Kemper wrote:

class C
  extend M
  foobar :example
end

This looks very nice. Thank you!

Modules are pleasant little beasts.

Oh yes...

Michael Roth

How about:

class Module
   def foobar id
     puts "Hello Ruby: #{id}"
   end
end

class C
    foobar :example
end

my_c = C.new

   module M
     module InstanceMethods
     end
     module ClassMethods
     end
     def self::included other
       other.module_eval{ include InstanceMethods }
       other.extend ClassMethods
       other <------------------?
     end
   end

   class C
     include M
   end

Why the "other" return (see question mark above)? It seems to work
without.

This is fine if you want to add the foobar method to ~all~ classes and
modules. I'd recommend Ara's way if you want to be more selective
about which classes get the methods.

Sean

···

On 9/25/05, michele <michelemendel@gmail.com> wrote:

How about:

class Module
  def foobar id
    puts "Hello Ruby: #{id}"
  end
end

class C
   foobar :example
end

my_c = C.new