class Puppet::Pops::Adaptable::Adapter

Base class for an Adapter.

A typical adapter just defines some accessors.

A more advanced adapter may need to setup the adapter based on the object it is adapting. @example Making Duck adaptable

class Duck
  include Puppet::Pops::Adaptable
end

@example Giving a Duck a nick name

class NickNameAdapter < Puppet::Pops::Adaptable::Adapter
  attr_accessor :nick_name
end
d = Duck.new
NickNameAdapter.adapt(d).nick_name = "Daffy"
NickNameAdapter.get(d).nick_name # => "Daffy"

@example Giving a Duck a more elaborate nick name

class NickNameAdapter < Puppet::Pops::Adaptable::Adapter
  attr_accessor :nick_name, :object
  def initialize o
    @object = o
    @nick_name = "Yo"
  end
  def nick_name
    "#{@nick_name}, the #{o.class.name}"
  end
  def NickNameAdapter.create_adapter(o)
    x = new o
    x
  end
end
d = Duck.new
n = NickNameAdapter.adapt(d)
n.nick_name # => "Yo, the Duck"
n.nick_name = "Daffy"
n.nick_name # => "Daffy, the Duck"

@example Using a block to set values

NickNameAdapter.adapt(o) { |a| a.nick_name = "Buddy!" }
NickNameAdapter.adapt(o) { |a, o| a.nick_name = "You're the best #{o.class.name} I met."}

Public Class Methods

adapt(o, &block) click to toggle source

Returns an existing adapter for the given object, or creates a new adapter if the object has not been adapted, or the adapter has been cleared.

@example Using a block to set values

NickNameAdapter.adapt(o) { |a| a.nick_name = "Buddy!" }
NickNameAdapter.adapt(o) { |a, o| a.nick_name = "Your the best #{o.class.name} I met."}

@overload adapt(o) @overload adapt(o, {|adapter| block}) @overload adapt(o, {|adapter, o| block}) @param o [Adaptable] object to add adapter to @yieldparam adapter [Adapter<self>] the created adapter @yieldparam o [Adaptable] optional, the given adaptable @param block [Proc] optional, evaluated in the context of the adapter (existing or new) @return [Adapter<self>] an adapter of the same class as the receiver of the call @raise [ArgumentError] if the given object o is not adaptable

    # File lib/puppet/pops/adaptable.rb
 92 def self.adapt(o, &block)
 93   attr_name = self_attr_name
 94   value = o.instance_variable_get(attr_name)
 95   adapter = value || associate_adapter(create_adapter(o), o)
 96   if block_given?
 97     if block.arity == 1
 98       block.call(adapter)
 99     else
100       block.call(adapter, o)
101     end
102   end
103   adapter
104 end
adapt_new(o, &block) click to toggle source

Creates a new adapter, associates it with the given object and returns the adapter.

@example Using a block to set values

NickNameAdapter.adapt_new(o) { |a| a.nick_name = "Buddy!" }
NickNameAdapter.adapt_new(o) { |a, o| a.nick_name = "Your the best #{o.class.name} I met."}

This is used when a fresh adapter is wanted instead of possible returning an existing adapter as in the case of {Adapter.adapt}. @overload adapt_new(o) @overload adapt_new(o, {|adapter| block}) @overload adapt_new(o, {|adapter, o| block}) @yieldparam adapter [Adapter<self>] the created adapter @yieldparam o [Adaptable] optional, the given adaptable @param o [Adaptable] object to add adapter to @param block [Proc] optional, evaluated in the context of the new adapter @return [Adapter<self>] an adapter of the same class as the receiver of the call @raise [ArgumentError] if the given object o is not adaptable

    # File lib/puppet/pops/adaptable.rb
123 def self.adapt_new(o, &block)
124   adapter = associate_adapter(create_adapter(o), o)
125   if block_given?
126     if block.arity == 1
127       block.call(adapter)
128     else
129       block.call(adapter, o)
130     end
131   end
132   adapter
133 end
associate_adapter(adapter, o) click to toggle source

Associates the given adapter with the given target object @param adapter [Adapter] the adapter to associate with the given object o @param o [Adaptable] the object to adapt @return [adapter] the given adapter

    # File lib/puppet/pops/adaptable.rb
165 def self.associate_adapter(adapter, o)
166   o.instance_variable_set(self_attr_name, adapter)
167   adapter
168 end
clear(o) click to toggle source

Clears the adapter set in the given object o. Returns any set adapter or nil. @param o [Adaptable] the object where the adapter should be cleared @return [Adapter] if an adapter was set @return [nil] if the adapter has not been set

    # File lib/puppet/pops/adaptable.rb
140 def self.clear(o)
141   attr_name = self_attr_name
142   if o.instance_variable_defined?(attr_name)
143     o.send(:remove_instance_variable, attr_name)
144   else
145     nil
146   end
147 end
create_adapter(o) click to toggle source

This base version creates an instance of the class (i.e. an instance of the concrete subclass of Adapter). A Specialization may want to create an adapter instance specialized for the given target object. @param o [Adaptable] The object to adapt. This implementation ignores this variable, but a

specialization may want to initialize itself differently depending on the object it is adapting.

@return [Adapter<self>] instance of the subclass of Adapter receiving the call

    # File lib/puppet/pops/adaptable.rb
156 def self.create_adapter(o)
157   new
158 end
get(o) click to toggle source

Returns an existing adapter for the given object, or nil, if the object is not adapted.

@param o [Adaptable] object to get adapter from @return [Adapter<self>] an adapter of the same class as the receiver of get @return [nil] if the given object o has not been adapted by the receiving adapter @raise [ArgumentError] if the object is not adaptable

   # File lib/puppet/pops/adaptable.rb
71 def self.get(o)
72   attr_name = self_attr_name
73   o.instance_variable_get(attr_name)
74 end
instance_var_name(name) click to toggle source

Returns a suitable instance variable name given a class name. The returned string is the fully qualified name of a class with '::' replaced by '_' since '::' is not allowed in an instance variable name. @param name [String] the fully qualified name of a class @return [String] the name with all '::' replaced by '_' @api private

    # File lib/puppet/pops/adaptable.rb
177 def self.instance_var_name(name)
178   name.split(DOUBLE_COLON).join(USCORE)
179 end
self_attr_name() click to toggle source

Returns a suitable instance variable name for the name of this instance. The name is created by calling Adapter#instance_var_name and then cached. @return [String] the instance variable name for name @api private

    # File lib/puppet/pops/adaptable.rb
192 def self.self_attr_name
193   @attr_name_sym ||= :"@#{instance_var_name(type_name)}"
194 end
type_name() click to toggle source

Returns the name of the class, or the name of the type if the class represents an Object type @return [String] the name of the class or type

    # File lib/puppet/pops/adaptable.rb
183 def self.type_name
184   self.name
185 end