mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 13:39:04 +02:00
[ruby/singleton] Simplify the implementation
(https://github.com/ruby/singleton/pull/7) Remove `__init__` and move logic to `included`.
This commit is contained in:
parent
4e26ae3cb9
commit
bebd05fb51
2 changed files with 20 additions and 17 deletions
|
@ -112,7 +112,7 @@ module Singleton
|
|||
module SingletonClassMethods # :nodoc:
|
||||
|
||||
def clone # :nodoc:
|
||||
Singleton.__init__(super)
|
||||
super.include(Singleton)
|
||||
end
|
||||
|
||||
# By default calls instance(). Override to retain singleton state.
|
||||
|
@ -121,31 +121,18 @@ module Singleton
|
|||
end
|
||||
|
||||
def instance # :nodoc:
|
||||
return @singleton__instance__ if @singleton__instance__
|
||||
@singleton__mutex__.synchronize {
|
||||
return @singleton__instance__ if @singleton__instance__
|
||||
@singleton__instance__ = new()
|
||||
}
|
||||
@singleton__instance__
|
||||
@singleton__instance__ || @singleton__mutex__.synchronize { @singleton__instance__ ||= new }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def inherited(sub_klass)
|
||||
super
|
||||
Singleton.__init__(sub_klass)
|
||||
sub_klass.include(Singleton)
|
||||
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
|
||||
|
@ -156,14 +143,19 @@ 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
|
||||
Singleton.__init__(klass)
|
||||
klass.instance_eval {
|
||||
@singleton__instance__ = nil
|
||||
@singleton__mutex__ = Thread::Mutex.new
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue