1416: def self.provide(name, options = {}, &block)
1417: name = Puppet::Util.symbolize(name)
1418:
1419: if obj = provider_hash[name]
1420: Puppet.debug "Reloading #{name} #{self.name} provider"
1421: unprovide(name)
1422: end
1423:
1424: parent = if pname = options[:parent]
1425: options.delete(:parent)
1426: if pname.is_a? Class
1427: pname
1428: else
1429: if provider = self.provider(pname)
1430: provider
1431: else
1432: raise Puppet::DevError,
1433: "Could not find parent provider #{pname} of #{name}"
1434: end
1435: end
1436: else
1437: Puppet::Provider
1438: end
1439:
1440: options[:resource_type] ||= self
1441:
1442: self.providify
1443:
1444:
1445: provider = genclass(
1446: name,
1447: :parent => parent,
1448: :hash => provider_hash,
1449: :prefix => "Provider",
1450: :block => block,
1451: :include => feature_module,
1452: :extend => feature_module,
1453:
1454: :attributes => options
1455: )
1456:
1457: provider
1458: end