Class: BinData::Registry
- Inherits:
-
Object
- Object
- BinData::Registry
- Defined in:
- lib/bindata/registry.rb
Overview
This registry contains a register of name -> class mappings.
Numerics (integers and floating point numbers) have an endian property as part of their name (e.g. int32be, float_le).
Classes exist in a namespace that mirrors the Ruby module hierarchy.
Classes can be looked up based on their full name or an abbreviated name
with hints.
There are two hints supported, :endian and :search_namespace.
#lookup("", "int32", { endian: :big }) will return Int32Be.
#lookup("", "my_type", { search_namespace: :ns }) will return Ns::MyType.
Names are stored in under_score_style, not camelCase.
Instance Method Summary collapse
-
#initialize ⇒ Registry
constructor
A new instance of Registry.
- #lookup(namespace, name, hints = {}) ⇒ Object
- #register(namespace, name, class_to_register) ⇒ Object
-
#underscore_name(name) ⇒ Object
Convert CamelCase
nameto underscore style. - #unregister(namespace, name) ⇒ Object
Constructor Details
#initialize ⇒ Registry
Returns a new instance of Registry.
23 24 25 26 |
# File 'lib/bindata/registry.rb', line 23 def initialize @registry = {} @backwards_compatible_registry = {} end |
Instance Method Details
#lookup(namespace, name, hints = {}) ⇒ Object
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/bindata/registry.rb', line 45 def lookup(namespace, name, hints = {}) search_names(namespace, name, hints).each do |search| register_dynamic_class(search) if @registry.has_key?(search) return @registry[search] end end # give the user a hint if the endian keyword is missing search_names(namespace, name, hints.merge(endian: :big)).each do |search| register_dynamic_class(search) if @registry.has_key?(search) raise(UnRegisteredTypeError, "#{name}, do you need to specify endian?") end end raise(UnRegisteredTypeError, name) end |
#register(namespace, name, class_to_register) ⇒ Object
28 29 30 31 32 33 34 35 36 |
# File 'lib/bindata/registry.rb', line 28 def register(namespace, name, class_to_register) return if namespace.nil? || name.nil? || class_to_register.nil? search = name_with_prefix(name, namespace) warn_if_name_is_already_registered(search, class_to_register) @registry[search] = class_to_register @backwards_compatible_registry[underscore_name(name)] = search end |
#underscore_name(name) ⇒ Object
Convert CamelCase name to underscore style.
65 66 67 68 69 70 71 72 73 |
# File 'lib/bindata/registry.rb', line 65 def underscore_name(name) name .to_s .gsub(/::/, "_") .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2') .gsub(/([a-z\d])([A-Z])/, '\1_\2') .tr('-', '_') .downcase end |
#unregister(namespace, name) ⇒ Object
38 39 40 41 42 43 |
# File 'lib/bindata/registry.rb', line 38 def unregister(namespace, name) search = name_with_prefix(name, namespace) @registry.delete(search) @backwards_compatible_registry.delete(underscore_name(name)) end |