2 require "decorate/create_alias"
4 # This module is highly experimental and might change significantly or
5 # be removed completely since its usefulness is highly questionable in
7 module Decorate::BeforeDecorator
11 # require "decorate/before_decorator"
14 # extend Decorate::BeforeDecorator
16 # before_decorator :trace_call, :call => :trace_call
18 # def trace_call(method_name, *args, &block)
19 # puts "Before #{self}.#{method_name}, args: #{args.inspect}, block: #{block.inspect}"
37 # Before #<Bf:0xb7b32dbc>.bar, args: [], block: nil
39 def before_decorator(decorator_name, opts) #:doc:
40 before_method_name = opts[:call]
41 unless before_method_name.kind_of?(Symbol)
42 raise "Option :call with Symbol argument required"
44 unkown_opt = opts.keys.find { |opt| ![:call].include?(opt) }
46 raise "Unknown option #{unknown_opt.inspect}"
49 self.class.send(:define_method, decorator_name) {
50 Decorate.decorate { |klass, method_name|
52 Decorate.create_alias(klass, method_name, decorator_name)
53 klass.class_eval <<-EOF, __FILE__, __LINE__
54 def #{method_name}(*args, &block)
55 self.__send__(:#{before_method_name},
56 :#{method_name}, *args, &block)
57 self.__send__(:#{wrapped_method_name},
64 private :before_decorator