module Norton::Counter::ClassMethods

Public Instance Methods

counter(name, options={}, &blk) click to toggle source
counter description

@param name [type] [description] @param options={} [type] [description] @param block [description]

@return [type] [description]

# File lib/norton/counter.rb, line 17
def counter(name, options={}, &blk)
  register_norton_value(name, :counter, options)
  redis = norton_value_redis_pool(name)

  # Redis: GET
  define_method(name) do
    instance_variable_get("@#{name}") || begin
      value = redis.with do |conn|
        conn.get(norton_value_key(name))
      end || send("#{name}_default_value")
      instance_variable_set("@#{name}", value.to_i)
    end
  end

  # Redis: SET
  define_method("#{name}=") do |value|
    if redis.with { |conn| conn.set(norton_value_key(name), value) }
      instance_variable_set("@#{name}", value.to_i)
    end
  end

  define_method("#{name}_default_value") do
    0
  end

  # Redis: INCR
  define_method("incr_#{name}") do
    value = redis.with do |conn|
      conn.incr(norton_value_key(name))
    end
    instance_variable_set("@#{name}", value.to_i)
  end

  # Redis: DECR
  define_method("decr_#{name}") do
    value = redis.with do |conn|
      conn.decr(norton_value_key(name))
    end
    instance_variable_set("@#{name}", value.to_i)
  end

  # Redis: INCRBY
  define_method("incr_#{name}_by") do |increment|
    value = redis.with do |conn|
      conn.incrby(norton_value_key(name), increment)
    end
    instance_variable_set("@#{name}", value.to_i)
  end

  # Redis: DECRBY
  define_method("decr_#{name}_by") do |decrement|
    value = redis.with do |conn|
      conn.decrby(norton_value_key(name), decrement)
    end
    instance_variable_set("@#{name}", value.to_i)
  end

  # Redis: SET
  define_method("reset_#{name}") do
    value = instance_eval(&blk)

    redis.with do |conn|
      conn.set(norton_value_key(name), value)
    end
    instance_variable_set("@#{name}", value)
  end

  # Redis: DEL
  define_method("remove_#{name}") do
    redis.with do |conn|
      conn.del(norton_value_key(name))
    end
    remove_instance_variable("@#{name}") if instance_variable_defined?("@#{name}")
  end
  send(:after_destroy, "remove_#{name}".to_sym) if respond_to? :after_destroy

  # Add Increment callback
  unless options[:incr].nil?
    options[:incr].each do |callback|
      send callback, proc{ instance_eval("incr_#{name}") }
    end
  end

  # Add Decrement callback
  unless options[:decr].nil?
    options[:decr].each do |callback|
      send callback, proc{ instance_eval("decr_#{name}") }
    end
  end
end