public function printGetDescriptor(Printer $printer)
 {
     $php_options = $this->descriptor->getOptions();
     $printer->put("/**\n");
     $printer->put(" * get descriptor for protocol buffers\n");
     $printer->put(" * \n");
     $printer->put(" * @return \\ProtocolBuffersDescriptor\n");
     $printer->put(" */\n");
     $printer->put("public static function getDescriptor()\n");
     $printer->put("{\n");
     $printer->indent();
     $printer->put("static \$descriptor;\n");
     $printer->put("\n");
     $printer->put("if (!isset(\$descriptor)) {\n");
     $printer->indent();
     $printer->put("\$desc = new `class_name`();\n", "class_name", Helper::getDescriptorBuilderClassName($this->descriptor));
     foreach ($this->descriptor->getField() as $offset => $field) {
         /* @var $field \google\protobuf\FieldDescriptorProto */
         $printer->put("\$desc->addField(`tag`, new `class_name`(array(\n", "tag", $field->getNumber(), "class_name", Helper::getFieldDescriptorClassName($this->descriptor));
         $printer->indent();
         $printer->put("\"type\"     => `type`,\n", "type", Helper::getFieldTypeName($field));
         $printer->put("\"name\"     => \"`name`\",\n", "name", $field->getName());
         $printer->put("\"required\" => `required`,\n", "required", FieldDescriptorProto\Label::isRequired($field) ? "true" : "false");
         $printer->put("\"optional\" => `optional`,\n", "optional", FieldDescriptorProto\Label::isOptional($field) ? "true" : "false");
         $printer->put("\"repeated\" => `repeated`,\n", "repeated", FieldDescriptorProto\Label::isRepeated($field) ? "true" : "false");
         $options = $field->getOptions();
         if ($options) {
             $printer->put("\"packable\" => `packable`,\n", "packable", FieldDescriptorProto\Label::isPacked($field) ? "true" : "false");
         } else {
             $printer->put("\"packable\" => `packable`,\n", "packable", "false");
         }
         $printer->put("\"default\"  => `value`,\n", "value", $this->defaultValueAsString($field));
         if (FieldDescriptorProto\Type::isMessage($field)) {
             $name = $field->getTypeName();
             $descriptor = MessagePool::get($name);
             $printer->put("\"message\" => '`message`',\n", "message", Helper::getClassName($descriptor, true));
         }
         $printer->outdent();
         $printer->put(")));\n");
     }
     if ($php_options instanceof \google\protobuf\MessageOptions) {
         $php_message_options = $php_options->getExtension("php_option");
         if ($php_message_options->getUseSingleProperty()) {
             $printer->put("\$phpoptions = \$desc->getOptions()->getExtension");
             $printer->put("(\\ProtocolBuffers::PHP_MESSAGE_OPTION);\n");
             $printer->put("\$phpoptions->setUseSingleProperty(true);\n");
             $printer->put("\$phpoptions->setSinglePropertyName(\"`name`\");\n", "name", $php_message_options->getSinglePropertyName());
             $printer->put("\n");
         }
     }
     $printer->put("// @@protoc_insertion_point(builder_scope:`name`)\n\n", "name", $this->descriptor->full_name);
     $printer->put("\$descriptor = \$desc->build();\n");
     $printer->outdent();
     $printer->put("}\n");
     $printer->put("return \$descriptor;\n");
     $printer->outdent();
     $printer->put("}\n\n");
 }