Skip to content

Instantly share code, notes, and snippets.

@marshluca
Created September 16, 2010 09:28
Show Gist options
  • Save marshluca/582177 to your computer and use it in GitHub Desktop.
Save marshluca/582177 to your computer and use it in GitHub Desktop.
class Polygon
@@sides = 10
def self.sides
@@sides
end
end
puts Polygon.sides # => 10
class Triangle < Polygon
@@sides = 3
end
puts Triangle.sides # => 3
puts Polygon.sides # => 3
class Rectangle < Polygon
@@sides = 4
end
puts Polygon.sides # => 4
class Polygon
@sides = 10
end
[Polygon, Rectangle].each do |klass|
puts klass.to_s + ".sides: " + klass.sides.to_s
puts
end
module ClassLevelInheritableAttributes
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def inheritable_attributes(*args)
@inheritable_attributes ||= [:inheritable_attributes]
@inheritable_attributes += args
args.each do |arg|
class_eval %(
class << self; attr_accessor :#{arg} end
)
end
@inheritable_attributes
end
def inherited(subclass)
@inheritable_attributes.each do |inheritable_attribute|
instance_var = "@#{inheritable_attribute}"
subclass.instance_variable_set(instance_var, instance_variable_get(instance_var))
end
end
end
end
require 'inheritable_attributes'
class Polygon
include ClassLevelInheritableAttributes
inheritable_attributes :sides, :coolness
@sides = 8
@coolness = 'Very'
end
class Triangle < Polygon
@sides = 3
end
class Octogon < Polygon; end
[Polygon, Octogon].each do |klass|
puts klass.to_s + ".instance_variables: " + klass.instance_variables.inspect
puts klass.to_s + ".sides: " + klass.sides.to_s
puts klass.to_s + ".coolness: " + klass.coolness.to_s
puts
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment