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