<?php
// DO NOT EDIT! Generated by Protobuf-PHP protoc plugin 1.0
// Source: helloworld.proto
//   Date: 2015-09-24 20:40:14

namespace helloworld {

  class HelloRequest extends \DrSlump\Protobuf\Message
  {
      /**  @var string */
    public $name = null;

    /** @var \Closure[] */
    protected static $__extensions = array();

      public static function descriptor()
      {
          $descriptor = new \DrSlump\Protobuf\Descriptor(__CLASS__, 'helloworld.HelloRequest');

      // OPTIONAL STRING name = 1
      $f = new \DrSlump\Protobuf\Field();
          $f->number = 1;
          $f->name = 'name';
          $f->type = \DrSlump\Protobuf::TYPE_STRING;
          $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
          $descriptor->addField($f);

          foreach (self::$__extensions as $cb) {
              $descriptor->addField($cb(), true);
          }

          return $descriptor;
      }

    /**
     * Check if <name> has a value.
     *
     * @return bool
     */
    public function hasName()
    {
        return $this->_has(1);
    }

    /**
     * Clear <name> value.
     *
     * @return \helloworld\HelloRequest
     */
    public function clearName()
    {
        return $this->_clear(1);
    }

    /**
     * Get <name> value.
     *
     * @return string
     */
    public function getName()
    {
        return $this->_get(1);
    }

    /**
     * Set <name> value.
     *
     * @param string $value
     *
     * @return \helloworld\HelloRequest
     */
    public function setName($value)
    {
        return $this->_set(1, $value);
    }
  }
}

namespace helloworld {

  class HelloReply extends \DrSlump\Protobuf\Message
  {
      /**  @var string */
    public $message = null;

    /** @var \Closure[] */
    protected static $__extensions = array();

      public static function descriptor()
      {
          $descriptor = new \DrSlump\Protobuf\Descriptor(__CLASS__, 'helloworld.HelloReply');

      // OPTIONAL STRING message = 1
      $f = new \DrSlump\Protobuf\Field();
          $f->number = 1;
          $f->name = 'message';
          $f->type = \DrSlump\Protobuf::TYPE_STRING;
          $f->rule = \DrSlump\Protobuf::RULE_OPTIONAL;
          $descriptor->addField($f);

          foreach (self::$__extensions as $cb) {
              $descriptor->addField($cb(), true);
          }

          return $descriptor;
      }

    /**
     * Check if <message> has a value.
     *
     * @return bool
     */
    public function hasMessage()
    {
        return $this->_has(1);
    }

    /**
     * Clear <message> value.
     *
     * @return \helloworld\HelloReply
     */
    public function clearMessage()
    {
        return $this->_clear(1);
    }

    /**
     * Get <message> value.
     *
     * @return string
     */
    public function getMessage()
    {
        return $this->_get(1);
    }

    /**
     * Set <message> value.
     *
     * @param string $value
     *
     * @return \helloworld\HelloReply
     */
    public function setMessage($value)
    {
        return $this->_set(1, $value);
    }
  }
}

namespace helloworld {

  class GreeterClient extends \Grpc\BaseStub
  {
      public function __construct($hostname, $opts)
      {
          parent::__construct($hostname, $opts);
      }
    /**
     * @param helloworld\HelloRequest $input
     */
    public function SayHello(\helloworld\HelloRequest $argument, $metadata = array(), $options = array())
    {
        return $this->_simpleRequest('/helloworld.Greeter/SayHello', $argument, '\helloworld\HelloReply::deserialize', $metadata, $options);
    }
  }
}
