Class: AttrExtras::AttrImplement
- Inherits:
-
Object
- Object
- AttrExtras::AttrImplement
- Defined in:
- lib/attr_extras/attr_implement.rb
Instance Method Summary collapse
- #apply ⇒ Object
-
#initialize(klass, names) ⇒ AttrImplement
constructor
A new instance of AttrImplement.
Constructor Details
#initialize(klass, names) ⇒ AttrImplement
Returns a new instance of AttrImplement.
2 3 4 |
# File 'lib/attr_extras/attr_implement.rb', line 2 def initialize(klass, names) @klass, @names = klass, names.dup end |
Instance Method Details
#apply ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# 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 |