module Getto::InitializeWith
Constants
- VERSION
Public Class Methods
included(m)
click to toggle source
# File lib/getto/initialize_with.rb, line 3 def self.included(m) m.singleton_class.class_eval do define_method :initialize_with do |*names,**specs| define_method :initialize do |**hash| names.each do |name| raise ArgumentError, "argument missing: #{name}" unless hash.has_key?(name) instance_variable_set :"@#{name}", hash.delete(name) end specs.each do |name,spec| raise ArgumentError, "argument missing: #{name}" unless hash.has_key?(name) entry = hash.delete(name) case when spec.is_a?(Class) unless entry.is_a?(spec) raise ArgumentError, "argument type error: #{name} is not a #{spec}" end when spec.respond_to?(:each) spec.each do |method| unless entry.respond_to?(method) raise ArgumentError, "argument type error: #{name} is not respond_to #{method}" end end else # :nocov: raise ArgumentError, "invalid spec: #{spec}" # :nocov: end instance_variable_set :"@#{name}", entry end raise ArgumentError, "unknown argument: #{hash.keys.join(",")}" unless hash.empty? self end attr_reader(*(names + specs.keys)) end end end