Module: Interjectable::ClassMethods

Defined in:
lib/interjectable.rb

Instance Method Summary collapse

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