Creating/accessing class vars from modules being used as mixins?

Hello,
I'm writing a module that is to be used as a mixin for classes. I
cannot create or access class variables from within module methods.
Please look at this small pastie. It contains the module definitions,
class definitions, and some sample code that demonstrates the errors
I'm receiving.

http://pastie.caboo.se/39581

Thanks for the help,
-- Christopher

Class variables have confusing inheritance rules, that I don't think are worth learning. (They are changing in a future version of Ruby.)

Instead, it's almost always easier to use instance variables on the class/module itself. Your code could do this with changes like:

module MyModule

    def self.included base
       base.extend ForBase
    end # def self.included

    module ForBase

      def message
       @message
      end

      def message=(message)
       @message = message
      end

       def acts_as_whatever options = {}
          include MyModule::InstanceMethods
          extend MyModule::ClassMethods

          if options.has_key? :message
             self.message = options[:message]
          else
             self.message = "no message"
          end
       end # def acts_as_whatever

    end # module ForBase

    module InstanceMethods

       def show_message
          puts self.class.message
       end

    end # module InstanceMethods

    module ClassMethods

       def print_message
          puts message
       end

    end # module ClassMethods

end # module MyModule

James Edward Gray II

···

On Feb 11, 2007, at 4:26 PM, Christopher J. Bottaro wrote:

I'm writing a module that is to be used as a mixin for classes. I
cannot create or access class variables from within module methods.
Please look at this small pastie. It contains the module definitions,
class definitions, and some sample code that demonstrates the errors
I'm receiving.

Wow, thanks for the fast response. Your solution worked perfectly.
On a side note, this should definitely be in a FAQ somewhere (if it
isn't already)... it's kind of a hard problem to figure out if you
don't know not to look at class variables.

Thanks again,
-- Christopher

···

On Feb 11, 5:16 pm, James Edward Gray II <j...@grayproductions.net> wrote:

On Feb 11, 2007, at 4:26 PM, Christopher J. Bottaro wrote:

> I'm writing a module that is to be used as a mixin for classes. I
> cannot create or access class variables from within module methods.
> Please look at this small pastie. It contains the module definitions,
> class definitions, and some sample code that demonstrates the errors
> I'm receiving.

Class variables have confusing inheritance rules, that I don't think
are worth learning. (They are changing in a future version of Ruby.)

Instead, it's almost always easier to use instance variables on the
class/module itself. Your code could do this with changes like:

module MyModule

    def self.included base
       base.extend ForBase
    end # def self.included

    module ForBase

      def message
       @message
      end

      def message=(message)
       @message = message
      end

       def acts_as_whatever options = {}
          include MyModule::InstanceMethods
          extend MyModule::ClassMethods

          if options.has_key? :message
             self.message = options[:message]
          else
             self.message = "no message"
          end
       end # def acts_as_whatever

    end # module ForBase

    module InstanceMethods

       def show_message
          puts self.class.message
       end

    end # module InstanceMethods

    module ClassMethods

       def print_message
          puts message
       end

    end # module ClassMethods

end # module MyModule

James Edward Gray II