This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
Doing Aspect-Oriented Programming | ||
---|---|---|
Code | Expected | Actual |
require 'aspectr' class Verbose < AspectR::Aspect def describe(method_sym, object, *args) "#{object.inspect}.#{method_sym}(#{args.join(",")})" end def before(method_sym, object, return_value, *args) puts "About to call #{describe(method_sym, object, *args)}." end def after(method_sym, object, return_value, *args) puts "#{describe(method_sym, object, *args)} has returned " + return_value.inspect + '.' end end verbose = Verbose.new stack = [] verbose.wrap(stack, :before, :after, :push, :pop) stack.push(10) |
About to call [].push(10). [10].push(10) has returned [[10]]. |
class_eval ' def push(*args,&block) return (__aop__-605349232_1687822(*args,&block)) unless Aspect.dispatch? begin exit_status = nil self.class.__aop_call_advice(:PRE, 'push', self, exit_status,*args,&block) exit_status = [] return (exit_status.push(__aop__-605349232_1687822(*args,&block)).last) rescue Exception exit_status = true raise ensure self.class.__aop_call_advice(:POST, 'push', self, exit_status,*args,&block) end end ' class_eval ' def pop(&block) return (__aop__-605349232_1689870(&block)) unless Aspect.dispatch? begin exit_status = nil self.class.__aop_call_advice(:PRE, 'pop', self, exit_status,&block) exit_status = [] return (exit_status.push(__aop__-605349232_1689870(&block)).last) rescue Exception exit_status = true raise ensure self.class.__aop_call_advice(:POST, 'pop', self, exit_status,&block) end end ' About to call [].push(10). [10].push(10) has returned [[10]]. |
stack.push(4) |
About to call [10].push(4). [10, 4].push(4) has returned [[10, 4]]. |
About to call [10].push(4). [10, 4].push(4) has returned [[10, 4]]. |
stack.pop |
About to call [10, 4].pop(). [10].pop() has returned [4]. |
About to call [10, 4].pop(). [10].pop() has returned [4]. |
class EvenMoreVerbose < AspectR::Aspect def useless(method_sym, object, return_value, *args) puts "More useless verbosity." end end more_verbose = EvenMoreVerbose.new more_verbose.wrap(stack, :useless, nil, :push) stack.push(60) |
About to call [10].push(60). More useless verbosity. [10, 60].push(60) has returned [[10, 60]]. |
About to call [10].push(60). More useless verbosity. [10, 60].push(60) has returned [[10, 60]]. |
verbose.unwrap(stack, :before, :after, :push, :pop) more_verbose.unwrap(stack, :useless, nil, :push) stack.push(100) |
[10, 60, 100] | [10, 60, 100] |