class BinData::Record


obj.s.field_names =># [“x”, “y”, “z”]
obj.field_names =># [“b”, “s”]
obj = SomeDataType.new
end
end
int8 :z
int8 :y
int8 :x
struct :s do
int16le :b
int32le :a
hide :a
class SomeDataType < BinData::Record
require ‘bindata’
A Record is a declarative wrapper around Struct.

def arg_extractor

def arg_extractor
  RecordArgExtractor
end

def define_field_accessors(fields) #:nodoc:

:nodoc:
Removing this method will not have any effect on correctness.
Struct#method_missing. This is purely a speed optimisation.
Defines accessor methods to avoid the overhead of going through
def define_field_accessors(fields) #:nodoc:
  unless method_defined?(:bindata_defined_accessors_for_fields?)
    fields.each_with_index do |field, i|
      name = field.name_as_sym
      if name
        define_field_accessors_for(name, i)
      end
    end
    define_method(:bindata_defined_accessors_for_fields?) { true }
  end
end

def define_field_accessors_for(name, index)

def define_field_accessors_for(name, index)
  define_method(name) do
    instantiate_obj_at(index) unless @field_objs[index]
    @field_objs[index]
  end
  define_method(name.to_s + "=") do |*vals|
    instantiate_obj_at(index) unless @field_objs[index]
    @field_objs[index].assign(*vals)
  end
end

def sanitize_parameters!(params) #:nodoc:

:nodoc:
def sanitize_parameters!(params) #:nodoc:
  params.merge!(dsl_params)
  super(params)
  define_field_accessors(params[:fields].fields)
end