Sha256: 4ddffa7b70bd981cbbaae2990cca4e601ac3f6c8c96f92f5875c861e34996dea

Contents?: true

Size: 1.75 KB

Versions: 20

Compression:

Stored size: 1.75 KB

Contents

require "delegate"

module ShopifyCli
  ##
  # `LazyDelegator` defers initialization of its underlying delegatee until the
  # latter is accessed for the first time due to a method call that the
  # delegator cannot handle itself:
  #
  #   result = LazyDelegator.new do
  #     # carry out costly operation ...
  #   end
  #
  #   result      # referencing the object itself does not result in Proc evaluation
  #   result.to_h # however, calling a method on it will result in Proc evaluation
  #
  # LazyDelegator lends itself to being subclassed in scenarios where some
  # facts are known and others are costly to compute:
  #
  #   class LazySpecificationHandler < ShopifyCli::LazyDelegator
  #     attr_reader :identifier
  #
  #     def initialize(identifier, &initializer)
  #       super(&initializer)
  #       @identifier = identifier
  #     end
  #   end
  #
  #   handler = LazySpecificationHandler.new(:product_subscription) do
  #      # fetch specification from the Partners Dashboard API ...
  #   end
  #
  #   # Accessing identifier will not result in Proc evaluation as it is
  #   # available as an attribute of the delegator itself
  #   handler.identifier # => :product_subscription
  #
  #   # Accessing the specification will result in evaluation of the Proc
  #   # and in our example in a subsequent network call
  #   handler.specification # => <Extension::Models::Specifcation:...>
  #
  class LazyDelegator < SimpleDelegator
    def initialize(&delegatee_initializer)
      super([false, delegatee_initializer])
    end

    protected

    def __getobj__(*)
      initialized, value_or_initializer = super
      return value_or_initializer if initialized
      value_or_initializer.call.tap do |value|
        __setobj__([true, value])
      end
    end
  end
end

Version data entries

20 entries across 20 versions & 1 rubygems

Version Path
shopify-cli-2.4.0 lib/shopify-cli/lazy_delegator.rb
shopify-cli-2.3.0 lib/shopify-cli/lazy_delegator.rb
shopify-cli-2.2.2 lib/shopify-cli/lazy_delegator.rb
shopify-cli-2.2.1 lib/shopify-cli/lazy_delegator.rb
shopify-cli-2.2.0 lib/shopify-cli/lazy_delegator.rb
shopify-cli-2.1.0 lib/shopify-cli/lazy_delegator.rb
shopify-cli-2.0.2 lib/shopify-cli/lazy_delegator.rb
shopify-cli-2.0.1 lib/shopify-cli/lazy_delegator.rb
shopify-cli-2.0.0 lib/shopify-cli/lazy_delegator.rb
shopify-cli-1.14.0 lib/shopify-cli/lazy_delegator.rb
shopify-cli-1.13.1 lib/shopify-cli/lazy_delegator.rb
shopify-cli-1.13.0 lib/shopify-cli/lazy_delegator.rb
shopify-cli-1.12.0 lib/shopify-cli/lazy_delegator.rb
shopify-cli-1.11.0 lib/shopify-cli/lazy_delegator.rb
shopify-cli-1.10.0 lib/shopify-cli/lazy_delegator.rb
shopify-cli-1.9.1 lib/shopify-cli/lazy_delegator.rb
shopify-cli-1.9.0 lib/shopify-cli/lazy_delegator.rb
shopify-cli-1.8.0 lib/shopify-cli/lazy_delegator.rb
shopify-cli-1.7.1 lib/shopify-cli/lazy_delegator.rb
shopify-cli-1.7.0 lib/shopify-cli/lazy_delegator.rb