lib/duck_puncher.rb in duck_puncher-4.2.3 vs lib/duck_puncher.rb in duck_puncher-4.3.0
- old
+ new
@@ -13,22 +13,22 @@
require 'duck_puncher/decoration'
require 'duck_puncher/utilities'
require 'duck_puncher/ancestral_hash'
require 'duck_puncher/duck'
require 'duck_puncher/ducks'
+require 'duck_puncher/unique_duck'
module DuckPuncher
autoload :GemInstaller, 'duck_puncher/gem_installer'
autoload :JSONStorage, 'duck_puncher/json_storage'
class << self
# @description Include additional functionality
- # Registration[:register, :deregister]
- # Decoration[:decorators, :build_decorator_class, :decorate, :cached_decorators, :undecorate]
- # Utilities[:lookup_constant, :redefine_constant]
- # AncestralHash[:ancestral_hash]
- include Registration, Decoration, Utilities, AncestralHash
+ include Registration # [:register, :deregister]
+ include Decoration # [:decorators, :build_decorator_class, :decorate, :cached_decorators, :undecorate]
+ include Utilities # [:lookup_constant, :redefine_constant]
+ include AncestralHash # [:ancestral_hash]
attr_accessor :logger
# Backwards compatibility
alias_method :log, :logger
@@ -37,18 +37,19 @@
def call(*args)
options = args.last.is_a?(Hash) ? args.pop : {}
classes = args.any? ? args : Ducks.list.keys
classes.each do |klass|
klass = lookup_constant(klass)
- (Ducks[klass] - punched_ducks).sort.each do |duck|
- punches = Array(options[:only] || duck.options[:only] || Ducks::Module.instance_method(:local_methods).bind(duck.mod).call)
- options[:target] = klass
- logger.info %Q(#{klass}#{" <-- #{duck.mod.name}#{punches}" if punches.any?})
- if duck.punch(options)
+ Ducks[klass].sort.each do |duck|
+ duck.punch_options = Ducks::Object.instance_method(:clone!).bind(options).call
+ duck.punch_options[:target] ||= klass
+ if punched_ducks.include?(duck)
+ logger.warn %(Already punched #{duck.mod.name})
+ elsif duck.punch(duck.punch_options).any?
punched_ducks << duck
else
- logger.error %Q(Failed to punch #{name})
+ logger.warn %(No punches were thrown)
end
end
end
nil
end
@@ -56,10 +57,21 @@
# Backwards compatibility
alias punch_all! call
alias punch! call
def punched_ducks
- @punched_ducks ||= []
+ @punched_ducks ||= Set.new
+ end
+
+ def register(*)
+ target, *_ = super
+ decorators[target] = build_decorator_class(*Ducks[target])
+ @cached_decorators = nil
+ end
+
+ def deregister(*)
+ super
+ @cached_decorators = nil
end
end
end
# Everyone likes defaults