module Condensable::GravityAbsorber

handle when an instance variable is not defined, absorber will create one on the fly

Public Instance Methods

condensable_missing_attribute(method_name, *args) click to toggle source
# File lib/condensable/gravity_absorber.rb, line 71
def condensable_missing_attribute(method_name, *args)
  default_handle_arg = Condensable::DEFAULT_VALUES[self.class.to_s]

  if default_handle_arg == :raise_error
    raise NoMethodError, "#{method_name} is undefined"
  elsif default_handle_arg == nil
    return nil
  elsif default_handle_arg.is_a?(Symbol)
    if method(default_handle_arg).arity == 0
      send(default_handle_arg)
    else
      send(default_handle_arg, method_name, *args)
    end
  elsif default_handle_arg.is_a?(String)
    return default_handle_arg
  end
end
condensed_values() click to toggle source

all condensed variables’ value

# File lib/condensable/gravity_absorber.rb, line 21
def condensed_values
  values = []
  condensed_variables.each do |var|
    values << send(var)
  end
  values
end
condensed_variables() click to toggle source

list all condensed variables

# File lib/condensable/gravity_absorber.rb, line 10
def condensed_variables
  @condensed_variables = [] if @condensed_variables.nil?
  @condensed_variables 
end
each() { |var, send(var)| ... } click to toggle source

iterating all condensed variables and its value

# File lib/condensable/gravity_absorber.rb, line 30
def each
  condensed_variables.each do |var|
    yield var, send(var)
  end
end
included(base) click to toggle source
# File lib/condensable/gravity_absorber.rb, line 5
def included(base)
  base.extend(GravityAbsorber::ClassLevelMethods)
end
is_condensed?(variable_name) click to toggle source

check whether a variable is a result of condensation

# File lib/condensable/gravity_absorber.rb, line 16
def is_condensed?(variable_name)
  @condensed_variables.include?(variable_name.to_sym)
end
method_missing(method_name, *args, &block) click to toggle source
# File lib/condensable/gravity_absorber.rb, line 36
def method_missing(method_name, *args, &block)
  if method_name.to_s[-1] == '='
    @condensed_variables = [] if @condensed_variables.nil?
    # get proper attribute name, by removing "="
    attribute_name = method_name[0..-2]
    setter_name = "#{attribute_name}="
    getter_name = attribute_name

    unless respond_to?(setter_name)
      instance_eval do
        eval %Q{
          def #{attribute_name}=(arg)
            @#{attribute_name} = arg
          end
        }
      end
    end

    unless respond_to?(getter_name)
      instance_eval do
        eval %Q{
          def #{attribute_name}
            @#{attribute_name}
          end
        }
      end # instance eval
      @condensed_variables << getter_name.to_sym
    end

    send(setter_name, *args)
  else
    condensable_missing_attribute(method_name, *args)
  end
end