v-yarotsky/medo

View on GitHub
lib/medo/support/decorator.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Medo
  module Support

    ##
    # This module is intended to extend other (decorator) modules
    #
    # Usage:
    #  
    #   module MyDecorator
    #     extend Support::Decorator
    #
    #     after_decorate do |arg1, arg2|
    #       @arg1, @arg2 = arg1, arg2
    #       ...
    #     end
    #
    #     #methods go here
    #   end
    #
    #   decorated = Object.new
    #   MyDecorator.decorate(decorate, :foo, :bar)
    #
    # :foo and :bar go to after_decorate block, which is evaluated 
    # on decorated object
    #
    # after_update block is optional
    #
    module Decorator
      def decorate(base, *args)
        base.extend(self)
        base.instance_exec(*args, &@after_decorate_block) if defined? @after_decorate_block
        base
      end

      def after_decorate(&block)
        @after_decorate_block = block
      end
    end
  end
end