Module: OptStruct

Defined in:
lib/opt_struct.rb,
lib/opt_struct/version.rb,
lib/opt_struct/class_methods.rb,
lib/opt_struct/module_methods.rb,
lib/opt_struct/instance_methods.rb

Defined Under Namespace

Modules: ClassMethods, InstanceMethods, ModuleMethods

Constant Summary collapse

RESERVED_WORDS =
[
  :class, :options,
  *OptStruct::InstanceMethods.instance_methods,
  *OptStruct::InstanceMethods.protected_instance_methods,
  *OptStruct::InstanceMethods.private_instance_methods,
].freeze
CLASS_IVARS =

list of class instance variables defined/tracked by opt_struct

%i[
  @defined_keys @required_keys @expected_arguments @defaults
  @_callbacks @_opt_structs
]
DEFAULT =

Default value object allows us to distinguish unspecified defaults from nil

Object.new
VERSION =
"1.7.0"

Class Method Summary collapse

Class Method Details

._inject_struct(target, source, args = [], **defaults, &callback) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/opt_struct.rb', line 23

def self._inject_struct(target, source, args = [], **defaults, &callback)
  existing = source.instance_variable_get(:@_opt_structs)
  structs = Array(existing).dup

  if args.any? || defaults.any? || block_given?
    structs << [args, defaults, callback]
  end

  target.instance_variable_set(:@_opt_structs, structs) if existing || structs.any?

  if target.is_a?(Class)
    target.instance_exec do
      extend ClassMethods
      attr_reader :options
      include InstanceMethods
    end
    structs.each do |s_args, s_defaults, s_callback|
      target.expect_arguments *s_args if s_args.any?
      target.options **s_defaults     if s_defaults.any?
      target.class_exec(&s_callback)  if s_callback
    end
  else
    target.singleton_class.prepend ModuleMethods
  end
  target
end

.build(*args, **defaults, &callback) ⇒ Object



64
65
66
# File 'lib/opt_struct.rb', line 64

def self.build(*args, **defaults, &callback)
  _inject_struct(Module.new, self, args.map(&:to_sym), **defaults, &callback)
end

.included(klass) ⇒ Object



50
51
52
53
# File 'lib/opt_struct.rb', line 50

def self.included(klass)
  _inject_struct(klass, self)
  super(klass)
end

.new(*args, **defaults, &callback) ⇒ Object



60
61
62
# File 'lib/opt_struct.rb', line 60

def self.new(*args, **defaults, &callback)
  _inject_struct(Class.new, self, args.map(&:to_sym), **defaults, &callback)
end

.prepended(klass) ⇒ Object



55
56
57
58
# File 'lib/opt_struct.rb', line 55

def self.prepended(klass)
  _inject_struct(klass, self)
  super(klass)
end