Class: Chef::Decorator

Inherits:
SimpleDelegator
  • Object
show all
Defined in:
lib/chef/decorator.rb,
lib/chef/decorator/lazy.rb,
lib/chef/decorator/unchain.rb,
lib/chef/decorator/lazy_array.rb

Direct Known Subclasses

Lazy

Defined Under Namespace

Classes: Lazy, LazyArray, Unchain

Instance Method Summary collapse

Constructor Details

#initialize(obj = NOT_PASSED) ⇒ Decorator

Returns a new instance of Decorator.



23
24
25
26
# File 'lib/chef/decorator.rb', line 23

def initialize(obj = NOT_PASSED)
  @__defined_methods__ = []
  super unless obj.equal?(NOT_PASSED)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(m, *args, &block) ⇒ Object

this is the ruby 2.2/2.3 implementation of Delegator#method_missing() with adding the define_singleton_method call and @defined_methods tracking



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/chef/decorator.rb', line 52

def method_missing(m, *args, &block)
  r = true
  target = __getobj__ { r = false }

  if r && target.respond_to?(m)
    # these next 4 lines are the patched code
    define_singleton_method(m) do |*args, &block|
      target.__send__(m, *args, &block)
    end
    @__defined_methods__.push(m)
    target.__send__(m, *args, &block)
  elsif ::Kernel.respond_to?(m, true)
    ::Kernel.instance_method(m).bind(self).call(*args, &block)
  else
    super(m, *args, &block)
  end
end

Instance Method Details

#__setobj__(obj) ⇒ Object

reset our methods on the instance if the object changes under us (this also clears out the closure over the target we create in method_missing below)



45
46
47
48
# File 'lib/chef/decorator.rb', line 45

def __setobj__(obj)
  __reset_methods__
  super
end

#is_a?(klass) ⇒ Boolean

if we wrap a Hash then decorator.is_a?(Hash) should be true

Returns:

  • (Boolean)


34
35
36
# File 'lib/chef/decorator.rb', line 34

def is_a?(klass)
  __getobj__.is_a?(klass) || super
end

#kind_of?(klass) ⇒ Boolean

if we wrap a Hash then decorator.kind_of?(Hash) should be true

Returns:

  • (Boolean)


39
40
41
# File 'lib/chef/decorator.rb', line 39

def kind_of?(klass)
  __getobj__.is_a?(klass) || super
end

#nil?Boolean

if we wrap a nil then decorator.nil? should be true

Returns:

  • (Boolean)


29
30
31
# File 'lib/chef/decorator.rb', line 29

def nil?
  __getobj__.nil?
end