#! /usr/bin/env ruby
t1 = Thread.new do
sleep(5)
puts "defining Klass"
class Klass; end
end
t2 = Thread.new do
sleep(10)
puts "undefining Klass"
Object.class_eval() { remove_const :Klass }
end
t3 = Thread.new do
begin
sleep(1)
k = Klass.new
puts "#{k} instantiated!"
rescue Exception => detail
puts "Klass error: #{detail}"
end while true
end
t3.join
$ ./constants.rb
Klass error: uninitialized constant Klass
Klass error: uninitialized constant Klass
Klass error: uninitialized constant Klass
Klass error: uninitialized constant Klass
defining Klass
#<Klass:0x007f8d040917b0> instantiated!
#<Klass:0x007f8d040916e8> instantiated!
#<Klass:0x007f8d04091620> instantiated!
#<Klass:0x007f8d04091558> instantiated!
#<Klass:0x007f8d04091490> instantiated!
undefining Klass
Klass error: uninitialized constant Klass
Klass error: uninitialized constant Klass
Klass error: uninitialized constant Klass
Klass error: uninitialized constant Klass
Klass error: uninitialized constant Klass
^C./constants.rb:27:in `join': Interrupt
from ./constants.rb:27:in `<main>'
diff --git a/lib/puppet/util/classgen.rb b/lib/puppet/util/classgen.rb
index 7993e69..8901c7a 100644
--- a/lib/puppet/util/classgen.rb
+++ b/lib/puppet/util/classgen.rb
@@ -142,6 +142,8 @@ module Puppet::Util::ClassGen
if is_constant_defined?(const)
if options[:overwrite]
+ # JJM This can't possibly work as Puppet.info is not always a method in
+ # this point of the life-cycle.
Puppet.info "Redefining #{name} in #{self}"
remove_const(const)
else
@@ -149,7 +151,11 @@ module Puppet::Util::ClassGen
"Class #{const} is already defined in #{self}"
end
end
+ # We can't use klass.name because Puppet apparently overrides the name
+ # method. =( Yay for us.
+ puts "Defining constant: #{const} (Name before): #{klass.ancestors.first}"
const_set(const, klass)
+ puts "Defining constant: #{const} (Name after ): #{klass.ancestors.first}"
const
end
Defining constant: DestSyslog (Name before): #<Class:0x007fb19113c730>
Defining constant: DestSyslog (Name after ): Puppet::Util::Log::DestSyslog
Defining constant: DestFile (Name before): #<Class:0x007fb19113bfb0>
Defining constant: DestFile (Name after ): Puppet::Util::Log::DestFile
Defining constant: DestConsole (Name before): #<Class:0x007fb19113b268>
Defining constant: DestConsole (Name after ): Puppet::Util::Log::DestConsole
Defining constant: DestHost (Name before): #<Class:0x007fb19111c660>
Defining constant: DestHost (Name after ): Puppet::Util::Log::DestHost
Defining constant: DestReport (Name before): #<Class:0x007fb19111c070>
Defining constant: DestReport (Name after ): Puppet::Util::Log::DestReport
Defining constant: DestArray (Name before): #<Class:0x007fb19111b2d8>
Defining constant: DestArray (Name after ): Puppet::Util::Log::DestArray
Defining constant: DestEventlog (Name before): #<Class:0x007fb19111a5e0>
Defining constant: DestEventlog (Name after ): Puppet::Util::Log::DestEventlog
Defining constant: MetaParamNoop (Name before): #<Class:0x007fb1911339c8>
Defining constant: MetaParamNoop (Name after ): Puppet::Type::MetaParamNoop
Defining constant: MetaParamSchedule (Name before): #<Class:0x007fb191132640>
Defining constant: MetaParamSchedule (Name after ): Puppet::Type::MetaParamSchedule
Defining constant: MetaParamAudit (Name before): #<Class:0x007fb1911313a8>
Defining constant: MetaParamAudit (Name after ): Puppet::Type::MetaParamAudit
Defining constant: MetaParamCheck (Name before): #<Class:0x007fb191136f10>
Defining constant: MetaParamCheck (Name after ): Puppet::Type::MetaParamCheck
Defining constant: MetaParamLoglevel (Name before): #<Class:0x007fb191136588>
Defining constant: MetaParamLoglevel (Name after ): Puppet::Type::MetaParamLoglevel
Defining constant: MetaParamAlias (Name before): #<Class:0x007fb191135368>
Defining constant: MetaParamAlias (Name after ): Puppet::Type::MetaParamAlias
Defining constant: MetaParamTag (Name before): #<Class:0x007fb191134990>
Defining constant: MetaParamTag (Name after ): Puppet::Type::MetaParamTag
Defining constant: MetaParamRequire (Name before): #<Class:0x007fb19113b920>
Defining constant: MetaParamRequire (Name after ): Puppet::Type::MetaParamRequire
Defining constant: MetaParamSubscribe (Name before): #<Class:0x007fb19113abb0>
Defining constant: MetaParamSubscribe (Name after ): Puppet::Type::MetaParamSubscribe
Defining constant: MetaParamBefore (Name before): #<Class:0x007fb191139eb8>
Defining constant: MetaParamBefore (Name after ): Puppet::Type::MetaParamBefore
Defining constant: MetaParamNotify (Name before): #<Class:0x007fb191139210>
Defining constant: MetaParamNotify (Name after ): Puppet::Type::MetaParamNotify
Defining constant: MetaParamStage (Name before): #<Class:0x007fb191140038>
Defining constant: MetaParamStage (Name after ): Puppet::Type::MetaParamStage
Defining constant: Component (Name before): Puppet::Type::Component
Defining constant: Component (Name after ): Puppet::Type::Component
Defining constant: ParameterName (Name before): #<Class:0x007fb193a7d428>
Defining constant: ParameterName (Name after ): Puppet::Type::Component::ParameterName
Defining constant: Log (Name before): #<Class:0x007fb19401d400>
Defining constant: Log (Name after ): Puppet::Util::Instrumentation::Log
Defining constant: Performance (Name before): #<Class:0x007fb19403d598>
Defining constant: Performance (Name after ): Puppet::Util::Instrumentation::Performance
Defining constant: Stage (Name before): Puppet::Type::Stage
Defining constant: Stage (Name after ): Puppet::Type::Stage
Defining constant: ParameterName (Name before): #<Class:0x007fb190835588>
Defining constant: ParameterName (Name after ): Puppet::Type::Stage::ParameterName
Defining constant: Notify (Name before): Puppet::Type::Notify
Defining constant: Notify (Name after ): Puppet::Type::Notify
Defining constant: Message (Name before): #<Class:0x007fb193929838>
Defining constant: Message (Name after ): Puppet::Type::Notify::Message
Defining constant: ParameterWithpath (Name before): #<Class:0x007fb1939285f0>
Defining constant: ParameterWithpath (Name after ): Puppet::Type::Notify::ParameterWithpath
Defining constant: ParameterName (Name before): #<Class:0x007fb193927768>
Defining constant: ParameterName (Name after ): Puppet::Type::Notify::ParameterName
Defining constant: Schedule (Name before): Puppet::Type::Schedule
Defining constant: Schedule (Name after ): Puppet::Type::Schedule
Defining constant: ParameterName (Name before): #<Class:0x007fb1940be648>
Defining constant: ParameterName (Name after ): Puppet::Type::Schedule::ParameterName
Defining constant: ParameterRange (Name before): #<Class:0x007fb1940bd6a8>
Defining constant: ParameterRange (Name after ): Puppet::Type::Schedule::ParameterRange
Defining constant: ParameterPeriodmatch (Name before): #<Class:0x007fb1940bbb78>
Defining constant: ParameterPeriodmatch (Name after ): Puppet::Type::Schedule::ParameterPeriodmatch
Defining constant: ParameterPeriod (Name before): #<Class:0x007fb1940b65b0>
Defining constant: ParameterPeriod (Name after ): Puppet::Type::Schedule::ParameterPeriod
Defining constant: ParameterRepeat (Name before): #<Class:0x007fb1940b55c0>
Defining constant: ParameterRepeat (Name after ): Puppet::Type::Schedule::ParameterRepeat
Defining constant: ParameterWeekday (Name before): #<Class:0x007fb1940b49e0>
Defining constant: ParameterWeekday (Name after ): Puppet::Type::Schedule::ParameterWeekday
Defining constant: Filebucket (Name before): Puppet::Type::Filebucket
Defining constant: Filebucket (Name after ): Puppet::Type::Filebucket
Defining constant: ParameterName (Name before): #<Class:0x007fb1940305c8>
Defining constant: ParameterName (Name after ): Puppet::Type::Filebucket::ParameterName
Defining constant: ParameterServer (Name before): #<Class:0x007fb19402fcb8>
Defining constant: ParameterServer (Name after ): Puppet::Type::Filebucket::ParameterServer
Defining constant: ParameterPort (Name before): #<Class:0x007fb19402f358>
Defining constant: ParameterPort (Name after ): Puppet::Type::Filebucket::ParameterPort
Defining constant: ParameterPath (Name before): #<Class:0x007fb19402dfd0>
Defining constant: ParameterPath (Name after ): Puppet::Type::Filebucket::ParameterPath
Defining constant: File (Name before): Puppet::Type::File
Defining constant: File (Name after ): Puppet::Type::File
Defining constant: ParameterPath (Name before): #<Class:0x007fb19201c700>
Defining constant: ParameterPath (Name after ): Puppet::Type::File::ParameterPath
Defining constant: ParameterBackup (Name before): #<Class:0x007fb192022a88>
Defining constant: ParameterBackup (Name after ): Puppet::Type::File::ParameterBackup
Defining constant: ParameterRecurse (Name before): #<Class:0x007fb1920212a0>
Defining constant: ParameterRecurse (Name after ): Puppet::Type::File::ParameterRecurse
Defining constant: ParameterRecurselimit (Name before): #<Class:0x007fb19201fd88>
Defining constant: ParameterRecurselimit (Name after ): Puppet::Type::File::ParameterRecurselimit
Defining constant: ParameterReplace (Name before): #<Class:0x007fb192026548>
Defining constant: ParameterReplace (Name after ): Puppet::Type::File::ParameterReplace
Defining constant: ParameterForce (Name before): #<Class:0x007fb192024dd8>
Defining constant: ParameterForce (Name after ): Puppet::Type::File::ParameterForce
Defining constant: ParameterIgnore (Name before): #<Class:0x007fb192023988>
Defining constant: ParameterIgnore (Name after ): Puppet::Type::File::ParameterIgnore
Defining constant: ParameterLinks (Name before): #<Class:0x007fb19202a2b0>
Defining constant: ParameterLinks (Name after ): Puppet::Type::File::ParameterLinks
Defining constant: ParameterPurge (Name before): #<Class:0x007fb192028a28>
Defining constant: ParameterPurge (Name after ): Puppet::Type::File::ParameterPurge
Defining constant: ParameterSourceselect (Name before): #<Class:0x007fb192033338>
Defining constant: ParameterSourceselect (Name after ): Puppet::Type::File::ParameterSourceselect
Defining constant: ParameterProvider (Name before): #<Class:0x007fb1920cca10>
Defining constant: ParameterProvider (Name after ): Puppet::Type::File::ParameterProvider
Defining constant: ProviderPosix (Name before): #<Class:0x007fb1920d54a8>
Defining constant: ProviderPosix (Name after ): Puppet::Type::File::ProviderPosix
Defining constant: ProviderWindows (Name before): #<Class:0x007fb194021820>
Defining constant: ProviderWindows (Name after ): Puppet::Type::File::ProviderWindows
Defining constant: ParameterChecksum (Name before): #<Class:0x007fb1940453d8>
Defining constant: ParameterChecksum (Name after ): Puppet::Type::File::ParameterChecksum
Defining constant: Content (Name before): #<Class:0x007fb193856690>
Defining constant: Content (Name after ): Puppet::Type::File::Content
Defining constant: ParameterSource (Name before): #<Class:0x007fb193a0e6e0>
Defining constant: ParameterSource (Name after ): Puppet::Type::File::ParameterSource
Defining constant: Target (Name before): #<Class:0x007fb193a46798>
Defining constant: Target (Name after ): Puppet::Type::File::Target
Defining constant: Ensure (Name before): #<Class:0x007fb193a95eb0>
Defining constant: Ensure (Name after ): Puppet::Type::File::Ensure
Defining constant: Owner (Name before): #<Class:0x007fb193aa80b0>
Defining constant: Owner (Name after ): Puppet::Type::File::Owner
Defining constant: Group (Name before): #<Class:0x007fb193ab03a0>
Defining constant: Group (Name after ): Puppet::Type::File::Group
Defining constant: Mode (Name before): #<Class:0x007fb193ac4418>
Defining constant: Mode (Name after ): Puppet::Type::File::Mode
Defining constant: Type (Name before): #<Class:0x007fb193ac5e30>
Defining constant: Type (Name after ): Puppet::Type::File::Type
Defining constant: ParameterSelinux_ignore_defaults (Name before): #<Class:0x007fb193adec28>
Defining constant: ParameterSelinux_ignore_defaults (Name after ): Puppet::Type::File::ParameterSelinux_ignore_defaults
Defining constant: Seluser (Name before): #<Class:0x007fb1923d49b0>
Defining constant: Seluser (Name after ): Puppet::Type::File::Seluser
Defining constant: Selrole (Name before): #<Class:0x007fb1923d4280>
Defining constant: Selrole (Name after ): Puppet::Type::File::Selrole
Defining constant: Seltype (Name before): #<Class:0x007fb1923d3b50>
Defining constant: Seltype (Name after ): Puppet::Type::File::Seltype
Defining constant: Selrange (Name before): #<Class:0x007fb1923d3420>
Defining constant: Selrange (Name after ): Puppet::Type::File::Selrange
Defining constant: Ctime (Name before): #<Class:0x007fb1923d11e8>
Defining constant: Ctime (Name after ): Puppet::Type::File::Ctime
Defining constant: Mtime (Name before): #<Class:0x007fb1923e20b0>
Defining constant: Mtime (Name after ): Puppet::Type::File::Mtime
Defining constant: User (Name before): Puppet::Type::User
Defining constant: User (Name after ): Puppet::Type::User
Defining constant: Ensure (Name before): #<Class:0x007fb192453e90>
Defining constant: Ensure (Name after ): Puppet::Type::User::Ensure
Defining constant: Home (Name before): #<Class:0x007fb192453170>
Defining constant: Home (Name after ): Puppet::Type::User::Home
Defining constant: Uid (Name before): #<Class:0x007fb192452ab8>
Defining constant: Uid (Name after ): Puppet::Type::User::Uid
Defining constant: Gid (Name before): #<Class:0x007fb192452388>
Defining constant: Gid (Name after ): Puppet::Type::User::Gid
Defining constant: Comment (Name before): #<Class:0x007fb192451c58>
Defining constant: Comment (Name after ): Puppet::Type::User::Comment
Defining constant: Shell (Name before): #<Class:0x007fb1924515c8>
Defining constant: Shell (Name after ): Puppet::Type::User::Shell
Defining constant: Password (Name before): #<Class:0x007fb193a0ea50>
Defining constant: Password (Name after ): Puppet::Type::User::Password
Defining constant: Password_min_age (Name before): #<Class:0x007fb193a0cc00>
Defining constant: Password_min_age (Name after ): Puppet::Type::User::Password_min_age
Defining constant: Password_max_age (Name before): #<Class:0x007fb19245d738>
Defining constant: Password_max_age (Name after ): Puppet::Type::User::Password_max_age
Defining constant: Groups (Name before): #<Class:0x007fb19245ce28>
Defining constant: Groups (Name after ): Puppet::Type::User::Groups
Defining constant: ParameterName (Name before): #<Class:0x007fb19245c680>
Defining constant: ParameterName (Name after ): Puppet::Type::User::ParameterName
Defining constant: ParameterMembership (Name before): #<Class:0x007fb19245bfa0>
Defining constant: ParameterMembership (Name after ): Puppet::Type::User::ParameterMembership
Defining constant: ParameterSystem (Name before): #<Class:0x007fb19245b6e0>
Defining constant: ParameterSystem (Name after ): Puppet::Type::User::ParameterSystem
Defining constant: ParameterAllowdupe (Name before): #<Class:0x007fb19245ad08>
Defining constant: ParameterAllowdupe (Name after ): Puppet::Type::User::ParameterAllowdupe
Defining constant: ParameterManagehome (Name before): #<Class:0x007fb19245a330>
Defining constant: ParameterManagehome (Name after ): Puppet::Type::User::ParameterManagehome
Defining constant: Expiry (Name before): #<Class:0x007fb193a02bb0>
Defining constant: Expiry (Name after ): Puppet::Type::User::Expiry
Defining constant: Roles (Name before): #<Class:0x007fb192461b58>
Defining constant: Roles (Name after ): Puppet::Type::User::Roles
Defining constant: ParameterRole_membership (Name before): #<Class:0x007fb1924611f8>
Defining constant: ParameterRole_membership (Name after ): Puppet::Type::User::ParameterRole_membership
Defining constant: Auths (Name before): #<Class:0x007fb1924609b0>
Defining constant: Auths (Name after ): Puppet::Type::User::Auths
Defining constant: ParameterAuth_membership (Name before): #<Class:0x007fb192460078>
Defining constant: ParameterAuth_membership (Name after ): Puppet::Type::User::ParameterAuth_membership
Defining constant: Profiles (Name before): #<Class:0x007fb19245f830>
Defining constant: Profiles (Name after ): Puppet::Type::User::Profiles
Defining constant: ParameterProfile_membership (Name before): #<Class:0x007fb19245eef8>
Defining constant: ParameterProfile_membership (Name after ): Puppet::Type::User::ParameterProfile_membership
Defining constant: Keys (Name before): #<Class:0x007fb19245e6b0>
Defining constant: Keys (Name after ): Puppet::Type::User::Keys
Defining constant: ParameterKey_membership (Name before): #<Class:0x007fb1939f3a98>
Defining constant: ParameterKey_membership (Name after ): Puppet::Type::User::ParameterKey_membership
Defining constant: Project (Name before): #<Class:0x007fb192465e88>
Defining constant: Project (Name after ): Puppet::Type::User::Project
Defining constant: ParameterIa_load_module (Name before): #<Class:0x007fb1924655c8>
Defining constant: ParameterIa_load_module (Name after ): Puppet::Type::User::ParameterIa_load_module
Defining constant: Attributes (Name before): #<Class:0x007fb192464e48>
Defining constant: Attributes (Name after ): Puppet::Type::User::Attributes
Defining constant: ParameterAttribute_membership (Name before): #<Class:0x007fb192464510>
Defining constant: ParameterAttribute_membership (Name after ): Puppet::Type::User::ParameterAttribute_membership
Defining constant: ParameterProvider (Name before): #<Class:0x007fb192310ee8>
Defining constant: ParameterProvider (Name after ): Puppet::Type::User::ParameterProvider
Defining constant: ProviderAix (Name before): #<Class:0x007fb19230f930>
Defining constant: ProviderAix (Name after ): Puppet::Type::User::ProviderAix
Defining constant: ProviderDirectoryservice (Name before): #<Class:0x007fb192019640>
Defining constant: ProviderDirectoryservice (Name after ): Puppet::Type::User::ProviderDirectoryservice
Defining constant: ProviderUseradd (Name before): #<Class:0x007fb1920b2b88>
Defining constant: ProviderUseradd (Name after ): Puppet::Type::User::ProviderUseradd
Defining constant: ProviderHpuxuseradd (Name before): #<Class:0x007fb1920da480>
Defining constant: ProviderHpuxuseradd (Name after ): Puppet::Type::User::ProviderHpuxuseradd
Defining constant: ProviderLdap (Name before): #<Class:0x007fb194097d18>
Defining constant: ProviderLdap (Name after ): Puppet::Type::User::ProviderLdap
Defining constant: ProviderPw (Name before): #<Class:0x007fb19393a3e0>
Defining constant: ProviderPw (Name after ): Puppet::Type::User::ProviderPw
Defining constant: ProviderUser_role_add (Name before): #<Class:0x007fb193a68a78>
Defining constant: ProviderUser_role_add (Name after ): Puppet::Type::User::ProviderUser_role_add
Defining constant: ProviderWindows_adsi (Name before): #<Class:0x007fb1923b1348>
Defining constant: ProviderWindows_adsi (Name after ): Puppet::Type::User::ProviderWindows_adsi
Defining constant: Group (Name before): Puppet::Type::Group
Defining constant: Group (Name after ): Puppet::Type::Group
Defining constant: Ensure (Name before): #<Class:0x007fb1923e6c78>
Defining constant: Ensure (Name after ): Puppet::Type::Group::Ensure
Defining constant: Gid (Name before): #<Class:0x007fb1923e62a0>
Defining constant: Gid (Name after ): Puppet::Type::Group::Gid
Defining constant: Members (Name before): #<Class:0x007fb1923e5b98>
Defining constant: Members (Name after ): Puppet::Type::Group::Members
Defining constant: ParameterAuth_membership (Name before): #<Class:0x007fb1923e5210>
Defining constant: ParameterAuth_membership (Name after ): Puppet::Type::Group::ParameterAuth_membership
Defining constant: ParameterName (Name before): #<Class:0x007fb1923ee220>
Defining constant: ParameterName (Name after ): Puppet::Type::Group::ParameterName
Defining constant: ParameterAllowdupe (Name before): #<Class:0x007fb1923edb40>
Defining constant: ParameterAllowdupe (Name after ): Puppet::Type::Group::ParameterAllowdupe
Defining constant: ParameterIa_load_module (Name before): #<Class:0x007fb1923ed190>
Defining constant: ParameterIa_load_module (Name after ): Puppet::Type::Group::ParameterIa_load_module
Defining constant: Attributes (Name before): #<Class:0x007fb1923ec9e8>
Defining constant: Attributes (Name after ): Puppet::Type::Group::Attributes
Defining constant: ParameterAttribute_membership (Name before): #<Class:0x007fb1923ec060>
Defining constant: ParameterAttribute_membership (Name after ): Puppet::Type::Group::ParameterAttribute_membership
Defining constant: ParameterSystem (Name before): #<Class:0x007fb1923eb7a0>
Defining constant: ParameterSystem (Name after ): Puppet::Type::Group::ParameterSystem
Defining constant: ParameterProvider (Name before): #<Class:0x007fb192409bb0>
Defining constant: ParameterProvider (Name after ): Puppet::Type::Group::ParameterProvider
Defining constant: ProviderAix (Name before): #<Class:0x007fb1924088c8>
Defining constant: ProviderAix (Name after ): Puppet::Type::Group::ProviderAix
Defining constant: ProviderDirectoryservice (Name before): #<Class:0x007fb19237a7d0>
Defining constant: ProviderDirectoryservice (Name after ): Puppet::Type::Group::ProviderDirectoryservice
Defining constant: ProviderGroupadd (Name before): #<Class:0x007fb192364fe8>
Defining constant: ProviderGroupadd (Name after ): Puppet::Type::Group::ProviderGroupadd
Defining constant: ProviderLdap (Name before): #<Class:0x007fb1923606a0>
Defining constant: ProviderLdap (Name after ): Puppet::Type::Group::ProviderLdap
Defining constant: ProviderPw (Name before): #<Class:0x007fb192427110>
Defining constant: ProviderPw (Name after ): Puppet::Type::Group::ProviderPw
Defining constant: ProviderWindows_adsi (Name before): #<Class:0x007fb192451aa0>
Defining constant: ProviderWindows_adsi (Name after ): Puppet::Type::Group::ProviderWindows_adsi
Defining constant: Whit (Name before): Puppet::Type::Whit
Defining constant: Whit (Name after ): Puppet::Type::Whit
Defining constant: ParameterName (Name before): #<Class:0x007fb1923089c8>
Defining constant: ParameterName (Name after ): Puppet::Type::Whit::ParameterName
hello
/Stage[main]//Notify[hello]/message: defined 'message' as 'hello'
Finished catalog run in 0.02 seconds
Defining constant: Store (Name before): #<Module:0x007fb192337ea8>
Defining constant: Store (Name after ): Puppet::Reports::Store
A bit more information.
Ruby support anonymous classes using
Class.newbut as soon as you bind an anonymous class to a constant the class takes on name of that constant. See Ruby - Creating Anonymous ClassesIn Puppet, we have the plumbing to create anonymous classes through
genclassandgenthing, however we quickly bind them to contants which means they're not anonymous for long at all and means they cannot be thread-local.Binding anonymous classes to constants