Module: Interjectable::ClassMethods
- Defined in:
- lib/interjectable.rb
Instance Method Summary collapse
-
#inject(dependency, &default_block) ⇒ Object
Defines a helper methods on instances that memoize values per-instance.
-
#inject_static(dependency, &default_block) ⇒ Object
Defines helper methods on instances that memoize values per-class.
Instance Method Details
#inject(dependency, &default_block) ⇒ Object
Defines a helper methods on instances that memoize values per-instance. Similar to writing
attr_writer :dependency
def dependency
@dependency ||= instance_eval(&default_block)
end
21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/interjectable.rb', line 21 def inject(dependency, &default_block) attr_writer dependency define_method(dependency) do ivar_name = "@#{dependency}" if instance_variable_defined?(ivar_name) instance_variable_get(ivar_name) else instance_variable_set(ivar_name, instance_eval(&default_block)) end end end |
#inject_static(dependency, &default_block) ⇒ Object
Defines helper methods on instances that memoize values per-class. (shared across all instances of a class, including instances of subclasses).
Calling a second time clears the value (if set) from previous times. This should probably only be called a second time in tests.
Similar to writing
cattr_writer :dependency
def dependency
@@dependency ||= instance_eval(&default_block)
end
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/interjectable.rb', line 47 def inject_static(dependency, &default_block) cvar_name = "@@#{dependency}" remove_class_variable(cvar_name) if class_variable_defined?(cvar_name) define_method("#{dependency}=") do |value| self.class.class_variable_set(cvar_name, value) end define_method(dependency) do if self.class.class_variable_defined?(cvar_name) self.class.class_variable_get(cvar_name) else self.class.class_variable_set(cvar_name, instance_eval(&default_block)) end end end |