# File lib/puppet/type.rb, line 1462
1462:   def self.providify
1463:     return if @paramhash.has_key? :provider
1464: 
1465:     newparam(:provider) do
1466:       desc "The specific backend for #{self.name.to_s} to use. You will
1467:         seldom need to specify this -- Puppet will usually discover the
1468:         appropriate provider for your platform."
1469: 
1470:       # This is so we can refer back to the type to get a list of
1471:       # providers for documentation.
1472:       class << self
1473:         attr_accessor :parenttype
1474:       end
1475: 
1476:       # We need to add documentation for each provider.
1477:       def self.doc
1478:         @doc + "  Available providers are:\n\n" + parenttype.providers.sort { |a,b|
1479:           a.to_s <=> b.to_s
1480:         }.collect { |i|
1481:           "* **#{i}**: #{parenttype().provider(i).doc}"
1482:         }.join("\n")
1483:       end
1484: 
1485:       defaultto {
1486:         @resource.class.defaultprovider.name
1487:       }
1488: 
1489:       validate do |provider_class|
1490:         provider_class = provider_class[0] if provider_class.is_a? Array
1491:         provider_class = provider_class.class.name if provider_class.is_a?(Puppet::Provider)
1492: 
1493:         unless provider = @resource.class.provider(provider_class)
1494:           raise ArgumentError, "Invalid #{@resource.class.name} provider '#{provider_class}'"
1495:         end
1496:       end
1497: 
1498:       munge do |provider|
1499:         provider = provider[0] if provider.is_a? Array
1500:         provider = provider.intern if provider.is_a? String
1501:         @resource.provider = provider
1502: 
1503:         if provider.is_a?(Puppet::Provider)
1504:           provider.class.name
1505:         else
1506:           provider
1507:         end
1508:       end
1509:     end.parenttype = self
1510:   end