module Collectible::Collection::WrapsCollectionMethods

Constants

PROXY_MODULE_NAME

Protected Instance Methods

collection_wrap() { || ... } click to toggle source
# File lib/collectible/collection/wraps_collection_methods.rb, line 22
def collection_wrap
  yield
end
collection_wrap_delegate(*methods) click to toggle source
# File lib/collectible/collection/wraps_collection_methods.rb, line 29
def collection_wrap_delegate(*methods)
  methods.each do |method_name|
    next if method_defined?(method_name)

    define_method(method_name) do |*arguments, &block|
      collection_wrap { items.public_send(method_name, *arguments, &block) }
    end
  end
end
collection_wrap_on(*methods) click to toggle source
Calls superclass method
# File lib/collectible/collection/wraps_collection_methods.rb, line 39
def collection_wrap_on(*methods)
  methods.each do |method_name|
    around_method(method_name, prevent_double_wrapping_for: PROXY_MODULE_NAME) do |*args, **opts, &block|
      # TODO: replace with `super(*args, **opts, &block)` when <= 2.6 support is dropped
      result = if RUBY_VERSION < "2.7" && opts.blank?
        super(*args, &block)
      else
        super(*args, **opts, &block)
      end

      return self if result.equal?(items)

      result.is_a?(Array) ? self.class.new(result) : result
    end
  end
end
collection_wrap_values_on(*methods) click to toggle source
Calls superclass method
# File lib/collectible/collection/wraps_collection_methods.rb, line 56
def collection_wrap_values_on(*methods)
  methods.each do |method_name|
    around_method(method_name, prevent_double_wrapping_for: PROXY_MODULE_NAME) do |*args, **opts, &block|
      # TODO: replace with `super(...)` when <= 2.6 support is dropped
      result = if RUBY_VERSION < "2.7" && opts.blank?
        super(*args, &block)
      else
        super(*args, **opts, &block)
      end

      if result.respond_to?(:transform_values)
        result.transform_values { |collection| collection_wrap { collection } }
      elsif result.respond_to?(:map)
        result.map { |collection| collection_wrap { collection } }
      else
        collection_wrap { result }
      end
    end
  end
end