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