module Decoration
Public Class Methods
included(base)
click to toggle source
# File lib/decoration.rb, line 2 def self.included(base) base.extend(ClassMethods) end
new(component)
click to toggle source
# File lib/decoration.rb, line 14 def initialize(component) @component = component check_behaviors! define_delegation end
Private Instance Methods
behavior_for(operation)
click to toggle source
# File lib/decoration.rb, line 55 def behavior_for(operation) get_behaviors[operation] end
check_behaviors!()
click to toggle source
# File lib/decoration.rb, line 22 def check_behaviors! get_decorations.each do |behavior| raise "method #{behavior} collides with the same name method of the component decorated" if get_originals.include?(behavior) end end
decorate(original_result, method, args)
click to toggle source
# File lib/decoration.rb, line 45 def decorate(original_result, method, args) return original_result unless method send(method, original_result, *args) end
define_delegated_method(operation)
click to toggle source
# File lib/decoration.rb, line 38 def define_delegated_method(operation) self.class.send(:define_method, operation) do |*args| result = execute_original(operation, args) decorate(result, behavior_for(operation), args) end end
define_delegation()
click to toggle source
# File lib/decoration.rb, line 32 def define_delegation get_originals.each do |method| define_delegated_method(method) end end
execute_original(operation, args)
click to toggle source
# File lib/decoration.rb, line 51 def execute_original(operation, args) @component.send(operation, *args) end
get_behaviors()
click to toggle source
# File lib/decoration.rb, line 63 def get_behaviors self.class.behaviors || {} end
get_decorations()
click to toggle source
# File lib/decoration.rb, line 28 def get_decorations get_behaviors.map { |_, value| value } end
get_originals()
click to toggle source
# File lib/decoration.rb, line 59 def get_originals @component.public_methods(false) end