lib/bindata/record.rb in bindata-1.0.0 vs lib/bindata/record.rb in bindata-1.1.0
- old
+ new
@@ -50,29 +50,38 @@
# Register the names of all subclasses of this class.
register(subclass.name, subclass)
end
def endian(endian = nil)
- @endian ||= nil
+ @endian ||= default_endian
if [:little, :big].include?(endian)
@endian = endian
elsif endian != nil
raise ArgumentError,
"unknown value for endian '#{endian}' in #{self}", caller(1)
end
@endian
end
def hide(*args)
- @hide ||= []
+ @hide ||= default_hide
@hide.concat(args.collect { |name| name.to_s })
@hide
end
+ def fields #:nodoc:
+ @fields ||= default_fields
+ end
+
def method_missing(symbol, *args) #:nodoc:
name, params = args
+ if name.is_a?(Hash)
+ params = name
+ name = nil
+ end
+
type = symbol
name = name.to_s
params ||= {}
append_field(type, name, params)
@@ -87,21 +96,38 @@
end
#-------------
private
- def fields
- unless defined? @fields
- sanitizer = Sanitizer.new
- @fields = sanitizer.create_sanitized_fields(endian)
+ def parent_record
+ ancestors[1..-1].find { |cls|
+ cls.ancestors[1..-1].include?(BinData::Record)
+ }
+ end
+
+ def default_endian
+ rec = parent_record
+ rec ? rec.endian : nil
+ end
+
+ def default_hide
+ rec = parent_record
+ rec ? rec.hide.dup : []
+ end
+
+ def default_fields
+ rec = parent_record
+ if rec
+ Sanitizer.new.clone_sanitized_fields(rec.fields)
+ else
+ Sanitizer.new.create_sanitized_fields
end
- @fields
end
def append_field(type, name, params)
ensure_valid_name(name)
- fields.add_field(type, name, params)
+ fields.add_field(type, name, params, endian)
rescue UnknownTypeError => err
raise TypeError, "unknown type '#{err.message}' for #{self}", caller(2)
end
def ensure_valid_name(name)