lib/bindata/wrapper.rb in bindata-1.1.0 vs lib/bindata/wrapper.rb in bindata-1.2.0
- old
+ new
@@ -1,6 +1,7 @@
require 'bindata/base'
+require 'bindata/dsl'
module BinData
# A Wrapper allows the creation of new BinData types that
# provide default parameters.
#
@@ -17,90 +18,33 @@
#
# arr = Uint8Array.new(:initial_length => 5, :initial_element_value => 3)
# arr.snapshot #=> [3, 3, 3, 3 ,3]
#
class Wrapper < BinData::Base
+ include DSLMixin
- class << self
+ register_subclasses
+ dsl_parser :only_one_field, :no_fieldnames
- def inherited(subclass) #:nodoc:
- # Register the names of all subclasses of this class.
- register(subclass.name, subclass)
- end
-
- def endian(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 wrapped(*args)
- @wrapped ||= default_wrapped
- if args.length == 2
- type, params = *args
- ensure_type_exists(type)
-
- if wrapped != nil
- raise SyntaxError, "#{self} can only wrap one type", caller(2)
- end
- @wrapped = [type, params]
- end
- @wrapped
- end
-
- def method_missing(symbol, *args) #:nodoc:
- type = symbol
- params = args.length == 0 ? {} : args[0]
-
- wrapped(type, params)
- end
-
+ class << self
def sanitize_parameters!(params, sanitizer) #:nodoc:
- raise "Nothing to wrap" if wrapped.nil?
+ raise "no wrapped type was specified in #{self}" if field.nil?
- wrapped_type, wrapped_params = wrapped
- wrapped_params = wrapped_params.dup
+ wrapped_type = field.type
+ wrapped_params = field.params.dup
params.move_unknown_parameters_to(wrapped_params)
params[:wrapped] = sanitizer.create_sanitized_object_prototype(wrapped_type, wrapped_params, endian)
end
-
- #-------------
- private
-
- def parent_wrapper
- ancestors[1..-1].find { |cls|
- cls.ancestors[1..-1].include?(BinData::Wrapper)
- }
- end
-
- def default_endian
- wrap = parent_wrapper
- wrap ? wrap.endian : nil
- end
-
- def default_wrapped
- wrap = parent_wrapper
- wrap ? wrap.wrapped : nil
- end
-
- def ensure_type_exists(type)
- unless RegisteredClasses.is_registered?(type, endian)
- raise TypeError, "unknown type '#{type}' for #{self}", caller(3)
- end
- end
end
- def initialize(params = {}, parent = nil)
- super(params, parent)
+ mandatory_parameter :wrapped
+ def initialize(parameters = {}, parent = nil)
+ super
+
prototype = get_parameter(:wrapped)
@wrapped = prototype.instantiate(self)
end
def clear #:nodoc:
@@ -110,10 +54,10 @@
def clear? #:nodoc:
wrapped.clear?
end
def respond_to?(symbol, include_private = false) #:nodoc:
- super || wrapped.respond_to?(symbol, include_private)
+ wrapped.respond_to?(symbol, include_private) || super
end
def method_missing(symbol, *args, &block) #:nodoc:
wrapped.__send__(symbol, *args, &block)
end