1 require 'active_support/core_ext/array/extract_options' 2 3 # Extends the class object with class and instance accessors for class attributes, 4 # just like the native attr* accessors for instance attributes. 5 # 6 # class Person 7 # cattr_accessor :hair_colors 8 # end 9 # 10 # Person.hair_colors = [:brown, :black, :blonde, :red] 11 class Class 12 def cattr_reader(*syms) 13 syms.flatten.each do |sym| 14 next if sym.is_a?(Hash) 15 class_eval(<<-EOS unless defined? @@#{sym} # unless defined? @@hair_colors 16 @@#{sym} = nil # @@hair_colors = nil 17 end # end 18 # 19 def self.#{sym} # def self.hair_colors 20 @@#{sym} # @@hair_colors 21 end # end 22 # 23 def #{sym} # def hair_colors 24 @@#{sym} # @@hair_colors 25 end # end 26 EOS 27 , __FILE__, __LINE__ + 1) 28 end 29 end 30 31 def cattr_writer(*syms) 32 options = syms.extract_options! 33 syms.flatten.each do |sym| 34 class_eval(<<-EOS unless defined? @@#{sym} # unless defined? @@hair_colors 35 @@#{sym} = nil # @@hair_colors = nil 36 end # end 37 # 38 def self.#{sym}=(obj) # def self.hair_colors=(obj) 39 @@#{sym} = obj # @@hair_colors = obj 40 end # end 41 # 42 #{" # 43 def #{sym}=(obj) # def hair_colors=(obj) 44 @@#{sym} = obj # @@hair_colors = obj 45 end # end 46 " unless options[:instance_writer] == false } # # instance writer above is generated unless options[:instance_writer] == false 47 EOS 48 , __FILE__, __LINE__ + 1) 49 self.send("#{sym}=", yield) if block_given? 50 end 51 end 52 53 def cattr_accessor(*syms, &blk) 54 cattr_reader(*syms) 55 cattr_writer(*syms, &blk) 56 end 57 end