module Adornable

Extend the `Adornable` module in your class in order to have access to the `decorate` and `add_decorators_from` macros.

Constants

VERSION

Public Instance Methods

add_decorators_from(receiver) click to toggle source
# File lib/adornable.rb, line 29
def add_decorators_from(receiver)
  adornable_machinery.register_decorator_receiver!(receiver)
end
adornable_machinery() click to toggle source
# File lib/adornable.rb, line 12
def adornable_machinery
  @adornable_machinery ||= Adornable::Machinery.new
end
decorate(decorator_name, from: nil, defer_validation: false, **decorator_options) click to toggle source
# File lib/adornable.rb, line 16
def decorate(decorator_name, from: nil, defer_validation: false, **decorator_options)
  if Adornable::Utils.blank?(name)
    raise Adornable::Error::InvalidDecoratorArguments, "Decorator name must be provided."
  end

  adornable_machinery.accumulate_decorator!(
    name: decorator_name,
    receiver: from,
    defer_validation: !!defer_validation,
    decorator_options: decorator_options,
  )
end
method_added(method_name) click to toggle source
Calls superclass method
# File lib/adornable.rb, line 33
def method_added(method_name)
  machinery = adornable_machinery # for local variable
  return unless machinery.accumulated_decorators?

  machinery.apply_accumulated_decorators_to_instance_method!(method_name)
  original_method = instance_method(method_name)
  define_method(method_name) do |*args|
    bound_method = original_method.bind(self)
    machinery.run_decorated_instance_method(bound_method, *args)
  end
  super
end
singleton_method_added(method_name) click to toggle source
Calls superclass method
# File lib/adornable.rb, line 46
def singleton_method_added(method_name)
  machinery = adornable_machinery # for local variable
  return unless machinery.accumulated_decorators?

  machinery.apply_accumulated_decorators_to_class_method!(method_name)
  original_method = method(method_name)
  define_singleton_method(method_name) do |*args|
    machinery.run_decorated_class_method(original_method, *args)
  end
  super
end