lib/bindata/base.rb in bindata-1.3.1 vs lib/bindata/base.rb in bindata-1.4.0

- old
+ new

@@ -7,13 +7,15 @@ module BinData # Error raised when unexpected results occur when reading data from IO. class ValidityError < StandardError ; end - # ArgExtractors take the arguments to BinData::Base.new and - # separate them into [value, parameters, parent]. + # ArgExtractors take the arguments passed to BinData::Base.new and + # separates them into [value, parameters, parent]. class BaseArgExtractor + @@empty_hash = Hash.new.freeze + def self.extract(the_class, the_args) args = the_args.dup value = parameters = parent = nil if args.length > 1 and args.last.is_a? BinData::Base @@ -26,11 +28,11 @@ if args.length > 0 value = args.pop end - parameters ||= {} + parameters ||= @@empty_hash return [value, parameters, parent] end end @@ -57,31 +59,31 @@ # The name of this class as used by Records, Arrays etc. def bindata_name RegisteredClasses.underscore_name(self.name) end - # Registers this class for use. - def register_self - register_class(self) + # Call this method if this class is abstract and not to be used. + def unregister_self + RegisteredClasses.unregister(name) end # Registers all subclasses of this class for use - def register_subclasses + def register_subclasses #:nodoc: class << self define_method(:inherited) do |subclass| - register_class(subclass) + RegisteredClasses.register(subclass.name, subclass) + register_subclasses end end end - def register_class(class_to_register) #:nodoc: - RegisteredClasses.register(class_to_register.name, class_to_register) - end - - private :register_self, :register_subclasses, :register_class + private :unregister_self, :register_subclasses end + # Register all subclasses of this class. + register_subclasses + # Creates a new data object. # # Args are optional, but if present, must be in the following order. # # +value+ is a value that is +assign+ed immediately after initialization. @@ -91,15 +93,16 @@ # # +parent+ is the parent data object (e.g. struct, array, choice) this # object resides under. def initialize(*args) value, parameters, parent = extract_args(args) - @params = Sanitizer.sanitize(parameters, self.class) + @params = SanitizedParameters.sanitize(parameters, self.class) + @parent = parent + add_methods_for_check_or_adjust_offset - @parent = parent if parent initialize_shared_instance initialize_instance assign(value) if value end @@ -123,11 +126,11 @@ # # +overrides+ is an optional +parameters+ like hash that allow the # parameters given at object construction to be overridden. # # Returns nil if +key+ does not refer to any parameter. - def eval_parameter(key, overrides = {}) + def eval_parameter(key, overrides = nil) LazyEvaluator.eval(self, get_parameter(key), overrides) end # Returns the parameter referenced by +key+. # Use this method if you are sure the parameter is not to be evaluated. @@ -253,10 +256,10 @@ ########################################################################### # To be implemented by subclasses # Performs sanity checks on the given parameters. This method converts # the parameters to the form expected by this data object. - def self.sanitize_parameters!(parameters, sanitizer) #:nodoc: + def self.sanitize_parameters!(parameters) #:nodoc: end # Initializes the state of the object. All instance variables that # are used by the object must be initialized here. def initialize_instance