Sha256: 8773fab1637a15eb2288506a6fef1a302287d0c3f39a2441b174f1efe2e4094c
Contents?: true
Size: 1.95 KB
Versions: 3
Compression:
Stored size: 1.95 KB
Contents
#!/usr/bin/env ruby # Example demonstrating emerging ideas about good aspect-oriented design. Specifically, this # example follows ideas of Jonathan Aldrich on "Open Modules", where a "module" (in the generic # sense of the word...) is responsible for defining and maintaining the pointcuts that it is # willing to expose to potential aspects. Aspects are only allowed to advise the module through # the pointcut. (Enforcing this constraint is TBD) # Griswold, Sullivan, and collaborators have expanded on these ideas. See their IEEE Software, # March 2006 paper. $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib' require 'aquarium' module Aquarium class ClassWithStateAndBehavior include Aquarium::Aspects::DSL::AspectDSL def initialize *args @state = args p "Initializing: #{args.inspect}" end attr_accessor :state # Two alternative versions of the following pointcut would be # STATE_CHANGE = pointcut :method => :state= # STATE_CHANGE = pointcut :attribute => :state, :attribute_options => [:writers] # Note that only matching on the attribute writers is important, especially # given the advice block below, because if the reader is allowed to be advised, # we get an infinite recursion of advice invocation! The correct solution is # the planned extension of the pointcut language to support condition tests for # context. I.e., we don't want the advice applied when it's already inside advice. STATE_CHANGE = pointcut :writing => :state end end include Aquarium::Aspects # Observe state changes in the class, using the class-defined pointcut. observer = Aspect.new :after, :pointcut => Aquarium::ClassWithStateAndBehavior::STATE_CHANGE do |jp, obj, *args| p "State has changed. " state = obj.state p " New state is #{state.nil? ? 'nil' : state.inspect}" p " Equivalent to *args: #{args.inspect}" end object = Aquarium::ClassWithStateAndBehavior.new(:a1, :a2, :a3) object.state = [:b1, :b2]
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
aquarium-0.3.0 | examples/aspect_design_example.rb |
aquarium-0.3.1 | examples/aspect_design_example.rb |
aquarium-0.4.0 | examples/aspect_design_example.rb |