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
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 91 def self.adapt(o, &block) 92 attr_name = self_attr_name 93 value = o.instance_variable_get(attr_name) 94 adapter = value || associate_adapter(create_adapter(o), o) 95 if block_given? 96 if block.arity == 1 97 block.call(adapter) 98 else 99 block.call(adapter, o) 100 end 101 end 102 adapter 103 end
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 122 def self.adapt_new(o, &block) 123 adapter = associate_adapter(create_adapter(o), o) 124 if block_given? 125 if block.arity == 1 126 block.call(adapter) 127 else 128 block.call(adapter, o) 129 end 130 end 131 adapter 132 end
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 164 def self.associate_adapter(adapter, o) 165 o.instance_variable_set(self_attr_name, adapter) 166 adapter 167 end
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 139 def self.clear(o) 140 attr_name = self_attr_name 141 if o.instance_variable_defined?(attr_name) 142 o.send(:remove_instance_variable, attr_name) 143 else 144 nil 145 end 146 end
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 155 def self.create_adapter(o) 156 new 157 end
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 70 def self.get(o) 71 attr_name = self_attr_name 72 o.instance_variable_get(attr_name) 73 end
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 176 def self.instance_var_name(name) 177 name.split(DOUBLE_COLON).join(USCORE) 178 end
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 191 def self.self_attr_name 192 @attr_name_sym ||= :"@#{instance_var_name(type_name)}" 193 end
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 182 def self.type_name 183 self.name 184 end