module SelfEnumerable

Constants

VERSION
WRAPPED_METHODS

Public Class Methods

included(klass) click to toggle source
# File lib/self_enumerable.rb, line 10
  def self.included(klass)
    klass.class_eval <<-eoruby
      include Enumerable
    eoruby

    # for every Enumerable method, e.g. #map, #select ...
    Enumerable.public_instance_methods.each do |_enum_method|
      if WRAPPED_METHODS.include?(_enum_method)
        if _enum_method == :partition # some special handling is needed
          klass.class_eval <<-eoruby
            def #{_enum_method}(*)
              (result = super).is_a?(Array) ? [self.class.new(result[0]), self.class.new(result[1])] : result
            end
          eoruby
        else
          klass.class_eval <<-eoruby
            def #{_enum_method}(*)
              (result = super).is_a?(Array) ? self.class.new(result) : result
            end
          eoruby
        end
      end
    end
  end