Class: Gumball::Dispenser

Inherits:
Object
  • Object
show all
Defined in:
lib/gumball/dispenser.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(ttl, logger: nil, &block) ⇒ Dispenser

Set up a new dispenser.

Parameters:

  • ttl (???)
  • block


13
14
15
16
17
18
19
# File 'lib/gumball/dispenser.rb', line 13

def initialize(ttl, logger: nil, &block)
  @ttl = ttl
  @logger = logger || Logger.new("/dev/null")
  @last_refreshed = nil
  @refresh_block = block
  @on_change_block = nil
end

Instance Attribute Details

#ttlObject (readonly)

Returns the value of attribute ttl.



7
8
9
# File 'lib/gumball/dispenser.rb', line 7

def ttl
  @ttl
end

Instance Method Details

#itemObject

Retrieve an item from the dispenser. On the first retrieval, a new instance of the item will be created, and returned until deemed expired by the specified ‘ttl`.

Returns:

  • item



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/gumball/dispenser.rb', line 34

def item
  now = Time.now
  old_item = @_item
  @_item = nil if expired?
  unless @_item
    @_item = @refresh_block.call
    @logger.info "#{self.class} refreshed, new_value=#{@_item}"
    if @last_refreshed && @on_change_block && (old_item != @_item)
      @logger.debug "#{self.class} executing on_change block; detected change from previous value #{old_item}"
      @on_change_block.call(old_item, @_item)
    end
    @last_refreshed = now
  end
  @_item
end

#on_change(&block) ⇒ self

Add a block to execute upon detection of a change in the item. The block should accept the old/new versions of the item.

Parameters:

  • block

Returns:

  • (self)


25
26
27
28
# File 'lib/gumball/dispenser.rb', line 25

def on_change(&block)
  @on_change_block = block
  self
end