module ActiveSupport::Notifications

def instrument(name, payload = {})

def instrument(name, payload = {})
  if @instrumenters[name]
    instrumenter.instrument(name, payload) { yield payload if block_given? }
  else
    yield payload if block_given?
  end
end

def instrumenter

def instrumenter
  Thread.current[:"instrumentation_#{notifier.object_id}"] ||= Instrumenter.new(notifier)
end

def publish(name, *args)

def publish(name, *args)
  notifier.publish(name, *args)
end

def subscribe(*args, &block)

def subscribe(*args, &block)
  notifier.subscribe(*args, &block).tap do
    @instrumenters.clear
  end
end

def subscribed(callback, *args, &block)

def subscribed(callback, *args, &block)
  subscriber = subscribe(*args, &callback)
  yield
ensure
  unsubscribe(subscriber)
end

def unsubscribe(args)

def unsubscribe(args)
  notifier.unsubscribe(args)
  @instrumenters.clear
end