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