Sha256: a1cd91269f70c97049f69e728df3eb30c12434c3d310655f17c561e4b23d31b5

Contents?: true

Size: 1.16 KB

Versions: 23

Compression:

Stored size: 1.16 KB

Contents

# frozen_string_literal: true

class Object
  # Set and restore public attributes around a block.
  #
  #   client.timeout # => 5
  #   client.with(timeout: 1) do |c|
  #     c.timeout # => 1
  #   end
  #   client.timeout # => 5
  #
  # The receiver is yielded to the provided block.
  #
  # This method is a shorthand for the common begin/ensure pattern:
  #
  #   old_value = object.attribute
  #   begin
  #     object.attribute = new_value
  #     # do things
  #   ensure
  #     object.attribute = old_value
  #   end
  #
  # It can be used on any object as long as both the reader and writer methods
  # are public.
  def with(**attributes)
    old_values = {}
    begin
      attributes.each do |key, value|
        old_values[key] = public_send(key)
        public_send("#{key}=", value)
      end
      yield self
    ensure
      old_values.each do |key, old_value|
        public_send("#{key}=", old_value)
      end
    end
  end
end

# #with isn't usable on immediates, so we might as well undefine the
# method in common immediate classes to avoid potential confusion.
[NilClass, TrueClass, FalseClass, Integer, Float, Symbol].each do |klass|
  klass.undef_method(:with)
end

Version data entries

23 entries across 23 versions & 2 rubygems

Version Path
activesupport-8.0.1 lib/active_support/core_ext/object/with.rb
activesupport-8.0.0.1 lib/active_support/core_ext/object/with.rb
activesupport-7.2.2.1 lib/active_support/core_ext/object/with.rb
activesupport-8.0.0 lib/active_support/core_ext/object/with.rb
activesupport-7.2.2 lib/active_support/core_ext/object/with.rb
activesupport-8.0.0.rc2 lib/active_support/core_ext/object/with.rb
activesupport-7.2.1.2 lib/active_support/core_ext/object/with.rb
activesupport-8.0.0.rc1 lib/active_support/core_ext/object/with.rb
activesupport-7.2.1.1 lib/active_support/core_ext/object/with.rb
activesupport-8.0.0.beta1 lib/active_support/core_ext/object/with.rb
omg-activesupport-8.0.0.alpha9 lib/active_support/core_ext/object/with.rb
omg-activesupport-8.0.0.alpha8 lib/active_support/core_ext/object/with.rb
omg-activesupport-8.0.0.alpha7 lib/active_support/core_ext/object/with.rb
omg-activesupport-8.0.0.alpha4 lib/active_support/core_ext/object/with.rb
omg-activesupport-8.0.0.alpha3 lib/active_support/core_ext/object/with.rb
omg-activesupport-8.0.0.alpha2 lib/active_support/core_ext/object/with.rb
omg-activesupport-8.0.0.alpha1 lib/active_support/core_ext/object/with.rb
activesupport-7.2.1 lib/active_support/core_ext/object/with.rb
activesupport-7.2.0 lib/active_support/core_ext/object/with.rb
activesupport-7.2.0.rc1 lib/active_support/core_ext/object/with.rb