content: /*
   * Copyright (C) 2015 Actor LLC. <https://actor.im>
   */
  
  package im.actor.runtime.actors;
  
  import im.actor.runtime.actors.dispatch.ActorDispatcher;
  import im.actor.runtime.actors.dispatch.ActorEndpoint;
  import im.actor.runtime.actors.dispatch.Envelope;
  
  /**
   * Reference to Actor that allows to send messages to real Actor
   */
  public class ActorRef {
  
      private ActorSystem system;
      private String path;
      private ActorEndpoint endpoint;
  
      public String getPath() {
          return path;
      }
  
      public ActorSystem system() {
          return system;
      }
  
      /**
       * <p>INTERNAL API</p>
       * Creating actor reference
       *
       * @param system actor system
       * @param path   path of actor
       */
      public ActorRef(ActorEndpoint endpoint, ActorSystem system, String path) {
          this.endpoint = endpoint;
          this.system = system;
          this.path = path;
      }
  
      /**
       * Send message with empty sender
       *
       * @param message message
       */
      public void send(Object message) {
          send(message, null);
      }
  
      /**
       * Execute on Actor Thread
       *
       * @param runnable runnable
       */
      public void post(Runnable runnable) {
          send(runnable);
      }
  
      /**
       * Send message with specified sender
       *
       * @param message message
       * @param sender  sender
       */
      public void send(Object message, ActorRef sender) {
          endpoint.getMailbox().schedule(new Envelope(message, endpoint.getScope(), endpoint.getMailbox(), sender));
      }
  
      /**
       * Sending message before all other messages
       *
       * @param message message
       * @param sender  sender
       */
      public void sendFirst(Object message, ActorRef sender) {
          endpoint.getMailbox().scheduleFirst(new Envelope(message, endpoint.getScope(), endpoint.getMailbox(), sender));
      }
  }
  