# Original code from Rails distribution. # http://www.rubyonrails.com #-- # Extends the module object with module and instance accessors # for class attributes, just like the native attr* accessors for # instance attributes. Aliases for classes are also provided. # # Example: # # mattr_accessor :my_attr, 'Default value' # # FIXME: I think those methods do *not* work as expected. # FIXME: I should probably use @-attributes instead of # @@-attributes. #++ class Module # :nodoc: # A macro that creates a reader method for class/module # attributes. def mattr_reader(*params) default = if params.last.is_a?(Symbol) then nil else params.pop end for sym in params module_eval <<-"end_eval", __FILE__, __LINE__ if not defined?(@@#{sym.id2name}) @@#{sym.id2name} = #{default.inspect} end def self.#{sym.id2name} @@#{sym} end end_eval end end alias_method :cattr_reader, :mattr_reader # A macro that creates a writer method for class/module # attributes. def mattr_writer(*params) default = if params.last.is_a?(Symbol) then nil else params.pop end for sym in params module_eval <<-"end_eval", __FILE__, __LINE__ if not defined?(@@#{sym.id2name}) @@#{sym.id2name} = #{default.inspect.inspect} end def self.#{sym.id2name}=(obj) @@#{sym.id2name} = obj end def self.set_#{sym.id2name}(obj) @@#{sym.id2name} = obj end end_eval end end alias_method :cattr_writer, :cattr_writer # A macro that creates a reader and a writer method for # class/module attributes. def mattr_accessor(*syms) mattr_reader(*syms) mattr_writer(*syms) end alias_method :cattr_accessor, :mattr_accessor end # * George Moschovitis