Allow descending classes to inherit instance variables. This is useful for persisting class-level configuration.
Add this line to your application's Gemfile:
gem 'inheritable_instance'
Insert the InheritableInstance
module into the ancestry chain of your class:
class FakeClass
extend InheritableInstance
end
Then use inheritable_instance
to set any instance variables
that you want to be inherited by subclasses:
class FakeClass
inheritable_instance :@thing_one, 1
inheritable_instance :@thing_two, 2
end
These variables will be automatically set on inheritance:
class DoubleFake < FakeClass; end
DoubleFake.instance_variable_get(:@thing_one) == 1
DoubleFake.instance_variable_get(:@thing_two) == 2
It is convenient to pair this with the attr_* methods:
class << FakeClass
attr_accessor :thing_two
end
DoubleFake.thing_two = "two"
FakeClass.thing_two == 2
DoubleFake.thing_two == "two"
Note that the values are duplicated (when possible):
class OneTwoThree
extend InheritableInstance
inheritable_instance :@list, []
class << self; attr_reader :list; end
end
OneTwoThree.list << 1 << 2 << 3
Abc = Class.new(OneTwoThree)
Abc.list << 'a' << 'b' << 'c'
Abc.list == [1,2,3,'a','b','c']
OneTwoThree.list == [1,2,3]
If for some reason it is inconvenient to extend
the module,
there is an Includible
helper that you can use instead:
class SameAsFakeClass
include InheritableInstance::Includible
end
Bug reports and pull requests are welcome on GitHub at https://github.com/fledman/inheritable_instance.
The gem is available as open source under the terms of the MIT License.