Module: Poise::Helpers::LazyDefault

Included in:
TemplateContent, Resource
Defined in:
lib/poise/helpers/lazy_default.rb

Overview

Resource mixin to allow lazyily-evaluated defaults in resource attributes. This is designed to be used with LWRPPolyfill or a similar #attributes method.

Examples:

class MyResource < Chef::Resource
  include Poise::Helpers::LWRPPolyfill
  include Poise::Helpers::LazyDefault
  attribute(:path, default: lazy { name + '_temp' })
end

Since:

  • 1.0.0

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.lazy(&block) ⇒ Chef::DelayedEvaluator

Create a lazyily-evaluated block.

Parameters:

  • block (Proc)

    Callable to return the default value.

Returns:

  • (Chef::DelayedEvaluator)

Since:

  • 1.0.0



66
67
68
# File 'lib/poise/helpers/lazy_default.rb', line 66

def lazy(&block)
  Chef::DelayedEvaluator.new(&block)
end

Instance Method Details

#set_or_return(symbol, arg, validation) ⇒ Object

Override the default set_or_return to support lazy evaluation of the default value. This only actually matters when it is called from a class level context via #attributes.

Since:

  • 1.0.0



47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/poise/helpers/lazy_default.rb', line 47

def set_or_return(symbol, arg, validation)
  if LazyDefault.needs_polyfill? && validation && validation[:default].is_a?(Chef::DelayedEvaluator)
    validation = validation.dup
    if (arg.nil? || arg == Poise::NOT_PASSED) && (!instance_variable_defined?(:"@#{symbol}") || instance_variable_get(:"@#{symbol}").nil?)
      validation[:default] = instance_eval(&validation[:default])
    else
      # Clear the default.
      validation.delete(:default)
    end
  end
  super(symbol, arg, validation)
end