class Protobuf::Visitor::CreateDescriptorVisitor

def add_option(name, value)

def add_option(name, value)
  options =
    case current_descriptor
    when Google::Protobuf::FileDescriptorProto then
      Google::Protobuf::FileOptions.new
    when Google::Protobuf::DescriptorProto then
      Google::Protobuf::MessageOptions.new
    when Google::Protobuf::FieldDescriptorProto then
      Google::Protobuf::FieldOptions.new
    when Google::Protobuf::EnumDescriptorProto then
      Google::Protobuf::EnumOptions.new
    when Google::Protobuf::EnumValueDescriptorProto then
      Google::Protobuf::EnumValueOptions.new
    when Google::Protobuf::ServiceDescriptorProto then
      Google::Protobuf::ServiceOptions.new
    when Google::Protobuf::MethodDescriptorProto then
      Google::Protobuf::MethodOptions.new
    else
      raise ArgumentError, 'Invalid context'
    end
  #TODO how should options be handled?
  #current_descriptor.options << option
end

def current_descriptor

def current_descriptor
  @context.last
end

def descriptor=(descriptor)

def descriptor=(descriptor)
  case current_descriptor
  when Google::Protobuf::FileDescriptorProto then
    current_descriptor.message_type << descriptor
  when Google::Protobuf::DescriptorProto then
    current_descriptor.nested_type << descriptor
  else
    raise ArgumentError, 'Invalid context'
  end
end

def enum_descriptor=(descriptor)

def enum_descriptor=(descriptor)
  current_descriptor.enum_type << descriptor
end

def enum_value_descriptor=(descriptor)

def enum_value_descriptor=(descriptor)
  current_descriptor.value << descriptor
end

def extension_range_descriptor=(descriptor)

def extension_range_descriptor=(descriptor)
  current_descriptor.extension_range << descriptor
end

def field_descriptor=(descriptor)

def field_descriptor=(descriptor)
  case current_descriptor
  when Google::Protobuf::FileDescriptorProto then
    current_descriptor.extension << descriptor
  when Google::Protobuf::DescriptorProto then
    current_descriptor.field << descriptor
    #TODO: how should i distiguish between field and extension
    #current_descriptor.extension << descriptor
  else
    raise ArgumentError, 'Invalid context'
  end
end

def file_descriptor=(descriptor)

def file_descriptor=(descriptor)
 @file_descriptor = descriptor
 @file_descriptor.name = @filename
end

def in_context(descriptor, &block)

def in_context(descriptor, &block)
  @context.push descriptor
  block.call
  @context.pop
end

def initialize(filename=nil)

def initialize(filename=nil)
  @context = []
  @filename = filename
end

def method_descriptor=(descriptor)

def method_descriptor=(descriptor)
  current_descriptor.method << descriptor
end

def service_descriptor=(descriptor)

def service_descriptor=(descriptor)
  current_descriptor.service << descriptor
end

def visit(node)

def visit(node)
  node.accept_descriptor_visitor(self)
  self
end