Module: KeywordStruct

Defined in:
lib/keyword_struct.rb,
lib/keyword_struct/version.rb

Constant Summary collapse

VERSION =
"1.0.0"

Class Method Summary collapse

Class Method Details

.new(*attrs, &block) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/keyword_struct.rb', line 4

def self.new(*attrs, &block)
  Class.new do
    # Define readers
    attr_reader *attrs

    define_method :initialize do |**kwargs|
      # Check all arguments are present
      missing_args = attrs.reject { |a| kwargs.key?(a) }

      unless missing_args.empty?
        message = (missing_args.length == 1) ? "missing keyword: #{missing_args.first}" : "missing keywords: #{missing_args.join(', ')}"
        fail ArgumentError, message
      end

      # Store arguments
      attrs.each do |attr|
        instance_variable_set("@#{attr}", kwargs[attr])
      end
    end

    # Custom methods
    class_eval &block if block
  end
end