CSC/ECE 517 Fall 2010/ch3 3d mr: Difference between revisions
Line 7: | Line 7: | ||
== Motivation == | == Motivation == | ||
== | == AspectR == | ||
=== Defining Aspects and wrapping methods === | |||
AspectR provides a simple mechanism for wrapping methods in a program. One begins by creating a class that inherits from Aspect and defining the wrapper methods which will be called at the various join points in the program. AspectR currently supports only two method join points, =PRE= and =POST=. | |||
which are used to call the aspect methods before a method call and after a method call. The inherited instance method =wrap= is used to specify the methods that should | |||
* wrap (target, pre, post, *args) - method which allows you to wrap methods from the target class's pre and post methods | * wrap (target, pre, post, *args) - method which allows you to wrap methods from the target class's pre and post methods | ||
=== Other methods === | |||
* unwrap (AspectR::Aspect) | * unwrap (AspectR::Aspect) | ||
* add_advice (AspectR::Aspect) | * add_advice (AspectR::Aspect) |
Revision as of 12:32, 5 October 2010
Aspect-oriented programming and AspectR
AspectR is a very useful Ruby module, but it is not easy to find documentation on it that is appropriate for students taking this class. Find, or construct, documentation that explains what it does without presuming previous knowledge of AspectJ, that describes many or all methods of the module and how they work. Also find or produce an easy-to-understand example that does not involve logging. Show how the example would be implemented in AspectJ and AspectR.
Overview
Motivation
AspectR
Defining Aspects and wrapping methods
AspectR provides a simple mechanism for wrapping methods in a program. One begins by creating a class that inherits from Aspect and defining the wrapper methods which will be called at the various join points in the program. AspectR currently supports only two method join points, =PRE= and =POST=.
which are used to call the aspect methods before a method call and after a method call. The inherited instance method =wrap= is used to specify the methods that should
- wrap (target, pre, post, *args) - method which allows you to wrap methods from the target class's pre and post methods
Other methods
- unwrap (AspectR::Aspect)
- add_advice (AspectR::Aspect)
- all_classes (AspectR)
- disable_advice_dispatching (AspectR::Aspect)
- dispatch? (AspectR::Aspect)
- get_methods (AspectR::Aspect)
- new (AspectR::Aspect)
- prepare (AspectR::Aspect)
- remove_advice (AspectR::Aspect)
- wrap_classes (AspectR)
- wrap_with_code (AspectR::Aspect)
- wrappable? (AspectR::Aspect)
Example
The code examples implement a code profiler to measure the duration of method calls.
AspectR
require aspectr.rb include AspectR class Profiler < Aspect def method_start(method, object, exitstatus, *args) @begin = Time.now end def method_end(method, object, exitstatus, *args) timeElapsed = Time.now - @begin puts "#{object.class}.#{method} took #{timeElapsed} secs" end end #if $0 == __FILE__ class SomeClass def some_method puts "hello" sleep 5 end end Profiler.new.wrap(SomeClass, :method_start, :method_end, /some/) SomeClass.new.some_method #end