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
DEFAULT =

Default value object allows us to distinguish unspecified defaults from nil

Object.new
VERSION =
"1.5.0"

Class Method Summary collapse

Class Method Details

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



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/opt_struct.rb', line 17

def self._inject_struct(target, source, args = [], **defaults, &callback)
  structs = Array(source.instance_variable_get(:@_opt_structs)).dup
  if args.any? || defaults.any? || block_given?
    structs << [args, defaults, callback]
  end
  target.instance_variable_set(:@_opt_structs, structs)
  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



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

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

.included(klass) ⇒ Object



40
41
42
43
# File 'lib/opt_struct.rb', line 40

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

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



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

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

.prepended(klass) ⇒ Object



45
46
47
48
# File 'lib/opt_struct.rb', line 45

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