class Celluloid::Probe

def actor_created(actor)

def actor_created(actor)
  trigger_event(:actor_created, actor)
end

def actor_died(actor)

def actor_died(actor)
  trigger_event(:actor_died, actor)
end

def actor_named(actor)

def actor_named(actor)
  trigger_event(:actor_named, actor)
end

def actors_linked(a, b)

def actors_linked(a, b)
  a = find_actor(a)
  b = find_actor(b)
  trigger_event(:actors_linked, a, b)
end

def dispatch_event(cmd, args)

def dispatch_event(cmd, args)
  publish(NOTIFICATIONS_TOPIC_BASE % cmd, args)
end

def find_actor(obj)

def find_actor(obj)
  if obj.__send__(:class) == Actor
    obj
  elsif owner = obj.instance_variable_get(OWNER_IVAR)
    owner
  end
end

def initialize

def initialize
  async.process_queue
end

def process_queue

def process_queue
  until EVENTS_BUFFER.empty?
    event = EVENTS_BUFFER.pop
    dispatch_event(*event)
  end
end

def run

def run
  # spawn the actor if not found
  supervise_as(:probe_actor) unless Actor[:probe_actor] && Actor[:probe_actor].alive?
end

def run_without_supervision

def run_without_supervision
  Actor[:probe_actor] = Celluloid::Probe.new
end

def trigger_event(name, *args)

def trigger_event(name, *args)
  # !!! DO NOT INTRODUCE ADDITIONAL GLOBAL VARIABLES !!!
  # rubocop:disable Style/GlobalVars
  return unless $CELLULOID_MONITORING
  # rubocop:enable Style/GlobalVars
  EVENTS_BUFFER << [name, args]
  probe_actor = Actor[:probe_actor]
  probe_actor.async.process_queue if probe_actor
end