code: def use(name, cost=nil)
  			# create a bucket using the default config if it doesn't already exist
  			bkt = @storage.get(name)
  			unless bkt
  				create_bucket(name)
  				bkt = @storage.get(name)
  			end
  			unless bkt
  				raise Exception, "Could not find bucket"
  			end
  			# first credit the bucket for the time that has elapsed
  			epochs_elapsed = ((Time.now.to_f - bkt.last_refill)/bkt.refill_epoch).to_i
  			bkt.current += epochs_elapsed * bkt.refill_amount
  			bkt.current = bkt.max if bkt.current > bkt.max
  			bkt.last_refill += epochs_elapsed*bkt.refill_epoch
  			# now see if the bkt has enough to provide service
  			cost ||= bkt.cost # if the cost isn't provided, use the default cost
  			raise "Invalid cost: #{cost}" if cost < 0
  			enough = bkt.current >= cost # true if sufficient, false if insufficient
  			# track the total costs, but only if service will be rendered
  			bkt.total_used += cost if enough
  			# now deduct the cost, capping at the minimum
  			bkt.current -= cost
  			bkt.current = bkt.min if bkt.current < bkt.min
  			# now save the changes into the storage (if memory, then no changes are needed, we updated the object in memory)
  			@storage.update(bkt)
  			# return the verdict, did they have enough credits to pay the toll?
  			enough
  		end
docs: Returns <i>true</i> if the item <tt>name</tt> has enough credits, <i>false</i> otherwise
   It will automatically create buckets for items that don't already have buckets and it will do all the bookkeeping to deduct credits, regenerate credits, and track all the credits used.
   <tt>name</tt>:: the name of the item to track
   <tt>cost</tt>:: the cost of the transaction (defaults to the cost set in the Bucket if nil)