diff options
Diffstat (limited to 'lib/singleton.rb')
-rw-r--r-- | lib/singleton.rb | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/lib/singleton.rb b/lib/singleton.rb index 757b77eba3..07420d2ea2 100644 --- a/lib/singleton.rb +++ b/lib/singleton.rb @@ -112,7 +112,7 @@ module Singleton module SingletonClassMethods # :nodoc: def clone # :nodoc: - super.include(Singleton) + Singleton.__init__(super) end # By default calls instance(). Override to retain singleton state. @@ -121,18 +121,31 @@ module Singleton end def instance # :nodoc: - @singleton__instance__ || @singleton__mutex__.synchronize { @singleton__instance__ ||= new } + return @singleton__instance__ if @singleton__instance__ + @singleton__mutex__.synchronize { + return @singleton__instance__ if @singleton__instance__ + @singleton__instance__ = new() + } + @singleton__instance__ end private def inherited(sub_klass) super - sub_klass.include(Singleton) + Singleton.__init__(sub_klass) end end class << Singleton # :nodoc: + def __init__(klass) # :nodoc: + klass.instance_eval { + @singleton__instance__ = nil + @singleton__mutex__ = Thread::Mutex.new + } + klass + end + private # extending an object with Singleton is a bad idea @@ -143,19 +156,14 @@ module Singleton unless mod.instance_of?(Class) raise TypeError, "Inclusion of the OO-Singleton module in module #{mod}" end - super end def included(klass) super - klass.private_class_method :new, :allocate klass.extend SingletonClassMethods - klass.instance_eval { - @singleton__instance__ = nil - @singleton__mutex__ = Thread::Mutex.new - } + Singleton.__init__(klass) end end |