module MiniObject::Injectable

Constants

NULL

Public Class Methods

getsetter_definition_for(name, default_block) click to toggle source
# File lib/mini_object/injectable.rb, line 14
def self.getsetter_definition_for name, default_block
  lambda do |value = NULL, &block|
  if value == NULL && block == nil
    get_attribute name, default_block
  else
    set_attribute name, value, block
  end
  end
end
included(klass) click to toggle source
# File lib/mini_object/injectable.rb, line 10
def self.included klass
  klass.extend self
end
new(&block) click to toggle source
Calls superclass method
# File lib/mini_object/injectable.rb, line 5
def initialize &block
  super
  block.call self if block
end
setter_definition_for(name) click to toggle source
# File lib/mini_object/injectable.rb, line 24
def self.setter_definition_for name
  lambda do |value|
    set_attribute name, value
  end
end

Public Instance Methods

attr_injectable(name, &block) click to toggle source
# File lib/mini_object/injectable.rb, line 37
def attr_injectable name, &block
  define_method name, &Injectable.getsetter_definition_for(name, block)
  define_method "#{name}=", &Injectable.setter_definition_for(name)
  instance_variable_set("@#{name}_default_proc", block) if block
end
attributes=(attrs) click to toggle source
# File lib/mini_object/injectable.rb, line 43
def attributes= attrs
  attrs.each do |k,v|
    public_send "#{k}=", v
  end
end
cattr_injectable(name, &block) click to toggle source
# File lib/mini_object/injectable.rb, line 30
def cattr_injectable name, &block
  define_singleton_method name, &Injectable.getsetter_definition_for(name, block)
  define_singleton_method "#{name}=", &Injectable.setter_definition_for(name)
  define_method name, -> { self.class.public_send name }
  send(name, &block) if block
end

Private Instance Methods

get_attribute(name, default_block) click to toggle source
# File lib/mini_object/injectable.rb, line 51
def get_attribute name, default_block
  if eval "defined? @#{name}"
    # Get via variable
    instance_variable_get :"@#{name}"
  elsif eval "defined? @#{name}_proc"
    # Get via proc
    instance_variable_get(:"@#{name}_proc").call
  elsif default_block
    default_block.call
  else
    raise "Dependency #{name} not defined yet"
  end
end
set_attribute(name, value = NULL, block = nil) click to toggle source
# File lib/mini_object/injectable.rb, line 65
def set_attribute name, value = NULL, block = nil
  if value == NULL
    # Set via proc
    instance_variable_set :"@#{name}_proc", block
    remove_instance_variable :"@#{name}" if eval "defined? @#{name}"
  elsif value == nil && block
    # Set via proc
    instance_variable_set :"@#{name}_proc", block
    remove_instance_variable :"@#{name}" if eval "defined? @#{name}"
  else
    # Set via variable
    instance_variable_set :"@#{name}", value
    remove_instance_variable :"@#{name}_proc" if eval "defined? @#{name}_proc"
  end

  block || value
end