class AttrExtras::AttrImplement

Public Class Methods

new(klass, names) click to toggle source
# File lib/attr_extras/attr_implement.rb, line 2
def initialize(klass, names)
  @klass, @names = klass, names.dup
end

Public Instance Methods

apply() click to toggle source
Calls superclass method
# File lib/attr_extras/attr_implement.rb, line 6
def apply
  arg_names = @names.last.is_a?(Array) ? @names.pop : []
  expected_arity = arg_names.length

  # Make available within the block.
  names = @names

  mod = Module.new do
    define_method :method_missing do |name, *args|
      if names.include?(name)
        provided_arity = args.length

        if provided_arity != expected_arity
          raise ArgumentError, "wrong number of arguments (#{provided_arity} for #{expected_arity})"
        end

        raise AttrExtras::MethodNotImplementedError, "Implement a#{"n" if name[0].match?(/\A[aeiou]/i)} '#{name}(#{arg_names.join(", ")})' method"
      else
        super(name, *args)
      end
    end
  end

  # include is private in Ruby 2.0 and earlier.
  @klass.send(:include, mod)
end