module Protobuf::Message::Fields::ClassMethods

def all_fields


Field Access Methods
#
def all_fields
  @all_fields ||= field_store.values.uniq.sort_by(&:tag)
end

def define_field(rule, type_class, field_name, tag, options)

def define_field(rule, type_class, field_name, tag, options)
  raise_if_tag_collision(tag, field_name)
  raise_if_name_collision(field_name)
  field = ::Protobuf::Field.build(self, rule, type_class, field_name, tag, options)
  field_store[field_name] = field
  field_store[tag] = field
  define_method("#{field_name}!") do
    @values[field_name]
  end
end

def extension_fields

def extension_fields
  @extension_fields ||= all_fields.select(&:extension?)
end

def extension_ranges

def extension_ranges
  @extension_ranges ||= []
end

def extension_tag?(tag)

def extension_tag?(tag)
  tag.respond_to?(:to_i) && get_extension_field(tag).present?
end

def extensions(range)


Define an extension range.
def extensions(range)
  extension_ranges << range
end

def field_store

def field_store
  @field_store ||= {}
end

def field_tag?(tag, allow_extension = false)

def field_tag?(tag, allow_extension = false)
  tag.respond_to?(:to_i) && get_field(tag, allow_extension).present?
end

def fields

def fields
  @fields ||= all_fields.reject(&:extension?)
end

def get_extension_field(name_or_tag)

def get_extension_field(name_or_tag)
  name_or_tag = name_or_tag.to_sym if name_or_tag.respond_to?(:to_sym)
  field = field_store[name_or_tag]
  field if field.try(:extension?) { false }
end

def get_field(name_or_tag, allow_extension = false)

def get_field(name_or_tag, allow_extension = false)
  name_or_tag = name_or_tag.to_sym if name_or_tag.respond_to?(:to_sym)
  field = field_store[name_or_tag]
  if field && (allow_extension || !field.extension?)
    field
  else
    nil
  end
end

def inherit_fields!(subclass)

def inherit_fields!(subclass)
  instance_variables.each do |iv|
    subclass.instance_variable_set(iv, instance_variable_get(iv))
  end
end

def optional(type_class, name, tag, options = {})


Define an optional field.
def optional(type_class, name, tag, options = {})
  define_field(:optional, type_class, name, tag, options)
end

def raise_if_name_collision(field_name)

def raise_if_name_collision(field_name)
  if get_field(field_name, true)
    fail DuplicateFieldNameError, %(Field name #{field_name} has already been used in "#{name}".)
  end
end

def raise_if_tag_collision(tag, field_name)

def raise_if_tag_collision(tag, field_name)
  if get_field(tag, true)
    fail TagCollisionError, %(Field number #{tag} has already been used in "#{name}" by field "#{field_name}".)
  end
end

def repeated(type_class, name, tag, options = {})


Define a repeated field.
def repeated(type_class, name, tag, options = {})
  define_field(:repeated, type_class, name, tag, options)
end

def required(type_class, name, tag, options = {})


Define a required field.
def required(type_class, name, tag, options = {})
  define_field(:required, type_class, name, tag, options)
end