We've moved the @providers class instance variable from
the individual Puppet::Type subclasses into a single
class instance variable in the Puppet::Type base class,
and are using an accessor to retrieve the per-class
providers hash.

Signed-off-by: Luke Kanies <[email protected]>
---
 lib/puppet/type.rb       |   32 ++++++++++++++++++++------------
 spec/integration/type.rb |   22 ++++++++++++++++++++++
 2 files changed, 42 insertions(+), 12 deletions(-)
 create mode 100755 spec/integration/type.rb

diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb
index d300338..6c41d79 100644
--- a/lib/puppet/type.rb
+++ b/lib/puppet/type.rb
@@ -984,7 +984,7 @@ class Type
 
     # Retrieve all known instances.  Either requires providers or must be 
overridden.
     def self.instances
-        unless defined?(@providers) and ! @providers.empty?
+        if provider_hash.empty?
             raise Puppet::DevError, "%s has no providers and has not 
overridden 'instances'" % self.name
         end
 
@@ -1489,26 +1489,35 @@ class Type
         return @defaultprovider
     end
 
+    def self.provider_hash_by_type(type)
+        @provider_hashes ||= {}
+        @provider_hashes[type] ||= {}
+    end
+
+    def self.provider_hash
+        Puppet::Type.provider_hash_by_type(self.name)
+    end
+
     # Retrieve a provider by name.
     def self.provider(name)
         name = Puppet::Util.symbolize(name)
 
         # If we don't have it yet, try loading it.
-        unless @providers.has_key?(name)
+        unless provider_hash.has_key?(name)
             @providerloader.load(name)
         end
-        return @providers[name]
+        return provider_hash[name]
     end
 
     # Just list all of the providers.
     def self.providers
-        @providers.keys
+        provider_hash.keys
     end
 
     def self.validprovider?(name)
         name = Puppet::Util.symbolize(name)
 
-        return (@providers.has_key?(name) && @providers[name].suitable?)
+        return (provider_hash.has_key?(name) && provider_hash[name].suitable?)
     end
 
     # Create a new provider of a type.  This method must be called
@@ -1516,7 +1525,7 @@ class Type
     def self.provide(name, options = {}, &block)
         name = Puppet::Util.symbolize(name)
 
-        if obj = @providers[name]
+        if obj = provider_hash[name]
             Puppet.debug "Reloading %s %s provider" % [name, self.name]
             unprovide(name)
         end
@@ -1544,7 +1553,7 @@ class Type
 
         provider = genclass(name,
             :parent => parent,
-            :hash => @providers,
+            :hash => provider_hash,
             :prefix => "Provider",
             :block => block,
             :include => feature_module,
@@ -1612,9 +1621,9 @@ class Type
     end
 
     def self.unprovide(name)
-        if @providers.has_key? name
+        if provider_hash.has_key? name
             rmclass(name,
-                :hash => @providers,
+                :hash => provider_hash,
                 :prefix => "Provider"
             )
             if @defaultprovider and @defaultprovider.name == name
@@ -1625,10 +1634,10 @@ class Type
 
     # Return an array of all of the suitable providers.
     def self.suitableprovider
-        if @providers.empty?
+        if provider_hash.empty?
             providerloader.loadall
         end
-        @providers.find_all { |name, provider|
+        provider_hash.find_all { |name, provider|
             provider.suitable?
         }.collect { |name, provider|
             provider
@@ -1790,7 +1799,6 @@ class Type
         @objects = Hash.new
         @aliases = Hash.new
 
-        @providers = Hash.new
         @defaults = {}
 
         unless defined? @parameters
diff --git a/spec/integration/type.rb b/spec/integration/type.rb
new file mode 100755
index 0000000..78e8947
--- /dev/null
+++ b/spec/integration/type.rb
@@ -0,0 +1,22 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../spec_helper'
+
+require 'puppet/type'
+
+describe Puppet::Type do
+    it "should not lose its provider list when it is reloaded" do
+        type = Puppet::Type.newtype(:integration_test) do
+            newparam(:name) {}
+        end
+
+        provider = type.provide(:myprovider) {}
+
+        # reload it
+        type = Puppet::Type.newtype(:integration_test) do
+            newparam(:name) {}
+        end
+
+        type.provider(:myprovider).should equal(provider)
+    end
+end
-- 
1.6.1


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to