module InheritableClassAttributes::ClassMethods

def cattr_inheritable_accessor(*symbols)

def cattr_inheritable_accessor(*symbols)
  cattr_inheritable_writer(*symbols)
  cattr_inheritable_reader(*symbols)
end

def cattr_inheritable_reader(*symbols)

def cattr_inheritable_reader(*symbols)
  symbols.each do |symbol|
    inheritable_cattr_readers << symbol
    module_eval %{
      def self.#{symbol}
        @#{symbol}
      end
    }
  end
  inheritable_cattr_readers.uniq!
end

def cattr_inheritable_writer(*symbols)

def cattr_inheritable_writer(*symbols)
  symbols.each do |symbol|
    inheritable_cattr_writers << symbol
    module_eval %{
      def self.#{symbol}=(value)
        @#{symbol} = value
      end
    }
  end
  inheritable_cattr_writers.uniq!
end

def inheritable_cattr_readers

def inheritable_cattr_readers
  @inheritable_class_readers ||= []
end

def inheritable_cattr_writers

def inheritable_cattr_writers
  @inheritable_class_writers ||= []
end

def inherited_with_inheritable_class_attributes(klass)

def inherited_with_inheritable_class_attributes(klass)
  inherited_without_inheritable_class_attributes(klass) if respond_to?(:inherited_without_inheritable_class_attributes)
  readers = inheritable_cattr_readers.dup
  writers = inheritable_cattr_writers.dup
  inheritables = %i[inheritable_cattr_readers inheritable_cattr_writers]
  (readers + writers + inheritables).uniq.each do |attr|
    var = "@#{attr}"
    old_value = module_eval(var)
    new_value = (begin
                   old_value.dup
                 rescue StandardError
                   old_value
                 end)
    klass.module_eval("#{var} = new_value")
  end
end