# File lib/puppet/type.rb, line 1574
1574:     def self.providify
1575:         return if @paramhash.has_key? :provider
1576: 
1577:         newparam(:provider) do
1578:             desc "The specific backend for #{self.name.to_s} to use. You will
1579:                 seldom need to specify this -- Puppet will usually discover the
1580:                 appropriate provider for your platform."
1581: 
1582:             # This is so we can refer back to the type to get a list of
1583:             # providers for documentation.
1584:             class << self
1585:                 attr_accessor :parenttype
1586:             end
1587: 
1588:             # We need to add documentation for each provider.
1589:             def self.doc
1590:                 @doc + "  Available providers are:\n\n" + parenttype().providers.sort { |a,b|
1591:                     a.to_s <=> b.to_s
1592:                 }.collect { |i|
1593:                     "* **%s**: %s" % [i, parenttype().provider(i).doc]
1594:                 }.join("\n")
1595:             end
1596: 
1597:             defaultto {
1598:                 @resource.class.defaultprovider.name
1599:             }
1600: 
1601:             validate do |provider_class|
1602:                 provider_class = provider_class[0] if provider_class.is_a? Array
1603:                 if provider_class.is_a?(Puppet::Provider)
1604:                     provider_class = provider_class.class.name
1605:                 end
1606: 
1607:                 unless provider = @resource.class.provider(provider_class)
1608:                     raise ArgumentError, "Invalid %s provider '%s'" % [@resource.class.name, provider_class]
1609:                 end
1610:             end
1611: 
1612:             munge do |provider|
1613:                 provider = provider[0] if provider.is_a? Array
1614:                 if provider.is_a? String
1615:                     provider = provider.intern
1616:                 end
1617:                 @resource.provider = provider
1618: 
1619:                 if provider.is_a?(Puppet::Provider)
1620:                     provider.class.name
1621:                 else
1622:                     provider
1623:                 end
1624:             end
1625:         end.parenttype = self
1626:     end