class Temporaries::Values::Helpers

Attributes

name[R]

Public Class Methods

new(name) click to toggle source
# File lib/temporaries/values.rb, line 62
def initialize(name)
  @name = name
end

Public Instance Methods

define(mod) click to toggle source
# File lib/temporaries/values.rb, line 93
      def define(mod)
        if exists
          save = "original_value = #{exists} ? #{get} : Temporaries::Values::UNDEFINED"
          restore = "value.equal?(Temporaries::Values::UNDEFINED) ? #{remove} : #{set}"
        else
          save = "original_value = #{get}"
          restore = set
        end

        mod.class_eval <<-EOS, __FILE__, __LINE__ + 1
          def push_#{name}(#{signature}, value)
            #{save}
            push_temporary(#{stack_key}, original_value)
            #{set}
          end

          def pop_#{name}(#{signature})
            value = pop_temporary(#{stack_key})
            #{restore}
          end

          def with_#{name}(#{signature}, value)
            push_#{name}(#{signature}, value)
            begin
              yield
            ensure
              pop_#{name}(#{signature})
            end
          end
        EOS

        mod::ClassMethods.module_eval <<-EOS, __FILE__, __LINE__ + 1
          def use_#{name}(#{signature}, value)
            temporaries_adapter.before do
              push_#{name}(#{signature}, value)
            end

            temporaries_adapter.after do
              pop_#{name}(#{signature})
            end
          end
        EOS
      end
signature(signature = nil) click to toggle source
# File lib/temporaries/values.rb, line 67
def signature(signature = nil)
  if signature
    @signature = signature
  else
    @signature
  end
end
stack_key() click to toggle source
# File lib/temporaries/values.rb, line 88
def stack_key
  sig_ids = signature.split(/\s*,\s*/).map{|s| s + '.__id__'}.join(', ')
  "[:#{name}, #{sig_ids}]"
end