Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save mlangenberg/7760 to your computer and use it in GitHub Desktop.
Save mlangenberg/7760 to your computer and use it in GitHub Desktop.
module Extlib
def self.class_inheritable_reader(klass, *ivars)
instance_reader = ivars.pop[:reader] if ivars.last.is_a?(Hash)
ivars.each do |ivar|
klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1
def self.#{ivar}
return @#{ivar} if self == #{klass} || defined?(@#{ivar})
ivar = superclass.#{ivar}
return nil if ivar.nil? && !#{klass}.instance_variable_defined?("@#{ivar}")
@#{ivar} = ivar && !ivar.is_a?(Module) && !ivar.is_a?(Numeric) ? ivar.dup : ivar
end
RUBY
unless instance_reader == false
klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1
def #{ivar}
self.class.#{ivar}
end
RUBY
end
end
end
def self.class_inheritable_writer(klass, *ivars)
instance_writer = ivars.pop[:instance_writer] if ivars.last.is_a?(Hash)
ivars.each do |ivar|
klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1
def self.#{ivar}=(obj)
@#{ivar} = obj
end
RUBY
unless instance_writer == false
klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1
def #{ivar}=(obj) self.class.#{ivar} = obj end
RUBY
end
end
end
def self.class_inheritable_accessor(klass, *syms)
class_inheritable_reader(klass, *syms)
class_inheritable_writer(klass, *syms)
end
end
module Merb; end
class Merb::Controller
Extlib::class_inheritable_accessor self, :_form_class
end
class Merb::Mailer
Extlib::class_inheritable_accessor self, :config
def initialize
self.config = 'hello' if config.nil?
end
end
puts Merb::Mailer.new.config #=> 'hello'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment