1 module InheritableClassAttributes
2 def self.included(base)
3 base.extend ClassMethods
6 alias inherited_without_inheritable_class_attributes inherited
7 alias inherited inherited_with_inheritable_class_attributes
13 def inheritable_cattr_readers
14 @inheritable_class_readers ||= []
17 def inheritable_cattr_writers
18 @inheritable_class_writers ||= []
21 def cattr_inheritable_reader(*symbols)
22 symbols.each do |symbol|
23 self.inheritable_cattr_readers << symbol
30 self.inheritable_cattr_readers.uniq!
33 def cattr_inheritable_writer(*symbols)
34 symbols.each do |symbol|
35 self.inheritable_cattr_writers << symbol
37 def self.#{symbol}=(value)
42 self.inheritable_cattr_writers.uniq!
45 def cattr_inheritable_accessor(*symbols)
46 cattr_inheritable_writer(*symbols)
47 cattr_inheritable_reader(*symbols)
50 def inherited_with_inheritable_class_attributes(klass)
51 inherited_without_inheritable_class_attributes(klass) if respond_to?(:inherited_without_inheritable_class_attributes)
53 readers = inheritable_cattr_readers.dup
54 writers = inheritable_cattr_writers.dup
55 inheritables = [:inheritable_cattr_readers, :inheritable_cattr_writers]
57 (readers + writers + inheritables).uniq.each do |attr|
59 old_value = self.module_eval(var)
60 new_value = (old_value.dup rescue old_value)
61 klass.module_eval("#{var} = new_value")