<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Wood for the Trees: Metaprogramming.apply(Aspects)</title>
    <link>http://www.mathewabonyi.com/articles/2007/10/09/metaprogramming-apply-aspects</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>struggling to dig life</description>
    <item>
      <title>Metaprogramming.apply(Aspects)</title>
      <description>&lt;p&gt;I&amp;#8217;m just briefly breaking my silence (which must continue a bit longer) to raise awareness about an impressive and very useful gem which has just come onto the scene: &lt;a href="http://aquarium.rubyforge.org/"&gt;Aquarium&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Although I don&amp;#8217;t follow Aspect Oriented Programming very closely, I know about its benefits and use it when necessary. All Rails developers, for example, employ its principles without even knowing it: before, after and around filters, proxies to alter execution, callbacks and the like. If you don&amp;#8217;t know about &lt;span class="caps"&gt;AOP&lt;/span&gt; yet, basically it&amp;#8217;s the practice of separating components which appear across the various classes of an application to provide system or class-agnostic functionality&amp;#8212;for example, logging, authentication or object persistence.&lt;/p&gt;


	&lt;p&gt;Having these components intrude on, for example, calculating a bank balance really gets annoying after a while. Imagine every moderately sized script you write needing lots of diagnostic messages, custom event handlers, and the like. It gets very tedious because you know there&amp;#8217;s the ideal of reuse just around the corner.&lt;/p&gt;


	&lt;h3&gt;Clean, Ruby-esque &lt;span class="caps"&gt;AOP&lt;/span&gt;&amp;#8230; a Pipe Dream?&lt;/h3&gt;


	&lt;p&gt;Imagine methods without calls to a logger, without a litter of &amp;#8216;if/then/else&amp;#8217; for authentication or authorisation, without calls to save an object and checking if it returns true or false&amp;#8230; What you&amp;#8217;ll get is the raw functionality of your class or module, which&amp;#8230; umm, is as it should be. Wrapping a method (using cuts, wrapping or aspects from &lt;span class="caps"&gt;AOP&lt;/span&gt;) lets you extract common functionality which cuts across objects.&lt;/p&gt;


	&lt;p&gt;Until now, there&amp;#8217;s only been the Facets libraries for &lt;span class="caps"&gt;AOP&lt;/span&gt; (&amp;#8216;advice&amp;#8217;, &amp;#8216;aop&amp;#8217; and &amp;#8216;cut&amp;#8217; in Facets 2.0.0) and AspectR. The former is buggy at best and the latter is like returning to Java. So I wasn&amp;#8217;t very keen on &lt;span class="caps"&gt;AOP&lt;/span&gt; in Ruby at all. Metaprogramming seemed easy enough and didn&amp;#8217;t need the structure of &lt;span class="caps"&gt;AOP&lt;/span&gt; to follow.&lt;/p&gt;


	&lt;p&gt;Enter Aquarium. It&amp;#8217;s a glass of clean water in a desert. Ruby-style. The most important thing it offers is a &amp;#8216;Join Point Model&amp;#8217; which will make you wet. In other words, it is very easy to intercept method calls to wrap them and introduce functionality before or after the original definition.&lt;/p&gt;


	&lt;p&gt;Sadly, I don&amp;#8217;t have the time for an extensive example from my own coding, so I&amp;#8217;ll have to rip off the example from Aquarium&amp;#8217;s own &lt;span class="caps"&gt;README&lt;/span&gt; which I think illustrates its power best (with a few modifications to show how I use it at the moment): method tracing.&lt;/p&gt;


	&lt;h3&gt;Example: Method Tracing&lt;/h3&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;rubygems&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;aquarium&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;aquarium/aspects/dsl/object_dsl&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="comment"&gt;# makes the Aspects DSL (before/after/around) system-wide&lt;/span&gt;

&lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;Example&lt;/span&gt;
  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Foo&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;
      &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Inside:   Foo#initialize: args = &lt;span class="expr"&gt;#{args.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;do_it&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;
      &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Inside:   Foo#do_it: args = &lt;span class="expr"&gt;#{args.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;BarModule&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;initialize&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;
      &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Inside:   BarModule#initialize: args = &lt;span class="expr"&gt;#{args.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;do_something_else&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;
      &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Inside:   BarModule#do_something_else: args = &lt;span class="expr"&gt;#{args.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Bar&lt;/span&gt;
    &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;BarModule&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Before advising the methods:&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;foo1&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Example&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Foo&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt; &lt;span class="symbol"&gt;:a1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:a2&lt;/span&gt;
&lt;span class="ident"&gt;foo1&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;do_it&lt;/span&gt; &lt;span class="symbol"&gt;:b1&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:b2&lt;/span&gt;

&lt;span class="ident"&gt;bar1&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Example&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Bar&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt; &lt;span class="symbol"&gt;:a3&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:a4&lt;/span&gt;
&lt;span class="ident"&gt;bar1&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;do_something_else&lt;/span&gt; &lt;span class="symbol"&gt;:b3&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:b4&lt;/span&gt;

&lt;span class="comment"&gt;# EXAMPLE 1: Wrapping methods on multiple classes using the powerful 'types' matcher.&lt;/span&gt;
&lt;span class="comment"&gt;# It can take constants or regular expressions. Also demonstrates method_options, which&lt;/span&gt;
&lt;span class="comment"&gt;# can specify public, protected, private, inherited or local methods.&lt;/span&gt;

&lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;Example&lt;/span&gt;
  &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;Aquarium&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Aspects&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;DSL&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;AspectDSL&lt;/span&gt;
  &lt;span class="ident"&gt;around&lt;/span&gt; &lt;span class="symbol"&gt;:types&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="constant"&gt;Foo&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;Bar&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="symbol"&gt;:methods&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:all&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; 
  &lt;span class="symbol"&gt;:method_options&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:suppress_ancestor_methods&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;jp&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="keyword"&gt;begin&lt;/span&gt;
      &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Ex. 1: Entering: &lt;span class="expr"&gt;#{jp.target_type.name}&lt;/span&gt;#&lt;span class="expr"&gt;#{jp.method_name}&lt;/span&gt;: args = &lt;span class="expr"&gt;#{args.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
      &lt;span class="ident"&gt;jp&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;proceed&lt;/span&gt;
    &lt;span class="keyword"&gt;ensure&lt;/span&gt;
      &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Ex. 1: Leaving:  &lt;span class="expr"&gt;#{jp.target_type.name}&lt;/span&gt;#&lt;span class="expr"&gt;#{jp.method_name}&lt;/span&gt;: args = &lt;span class="expr"&gt;#{args.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="comment"&gt;# EXAMPLE 2: Wrapping one or more methods very simply.&lt;/span&gt;
&lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;Example&lt;/span&gt;
  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Bar&lt;/span&gt;
    &lt;span class="ident"&gt;after&lt;/span&gt; &lt;span class="symbol"&gt;:do_something_else&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;jp&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Ex. 2: Simply after: &lt;span class="expr"&gt;#{jp.target_type.name}&lt;/span&gt;#&lt;span class="expr"&gt;#{jp.method_name}&lt;/span&gt;: args = &lt;span class="expr"&gt;#{args.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="comment"&gt;# EXAMPLE 3: Using the Aspect class without the DSL&lt;/span&gt;

&lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;Aquarium&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Aspects&lt;/span&gt;
&lt;span class="constant"&gt;Aspect&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt; &lt;span class="symbol"&gt;:before&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:method&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:do_it&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:type&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;Example&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Foo&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;jp&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Ex. 3: Simply before (using Aspect.new): &lt;span class="expr"&gt;#{jp.target_type.name}&lt;/span&gt;#&lt;span class="expr"&gt;#{jp.method_name}&lt;/span&gt;: args = &lt;span class="expr"&gt;#{args.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="comment"&gt;# EXAMPLE 4: Contain aspects within a namespace for clarity. These are executed&lt;/span&gt;
&lt;span class="comment"&gt;# upon loading the source.&lt;/span&gt;

&lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;Example&lt;/span&gt;
  &lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;AllAspects&lt;/span&gt;
    &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;Aquarium&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Aspects&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;DSL&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;AspectDSL&lt;/span&gt;
    &lt;span class="ident"&gt;before&lt;/span&gt; &lt;span class="symbol"&gt;:do_it&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:type&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;Example&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Foo&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;jp&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Ex. 4: Simply before (using namespaces): &lt;span class="expr"&gt;#{jp.target_type.name}&lt;/span&gt;#&lt;span class="expr"&gt;#{jp.method_name}&lt;/span&gt;: args = &lt;span class="expr"&gt;#{args.inspect}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="comment"&gt;# And now see the result...&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt;
&lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;After advising the methods. Notice that #intialize isn't advised:&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="ident"&gt;foo2&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Example&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Foo&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt; &lt;span class="symbol"&gt;:a5&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:a6&lt;/span&gt;
&lt;span class="ident"&gt;foo2&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;do_it&lt;/span&gt; &lt;span class="symbol"&gt;:b5&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:b6&lt;/span&gt;

&lt;span class="ident"&gt;bar1&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Example&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Bar&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt; &lt;span class="symbol"&gt;:a7&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:a8&lt;/span&gt;
&lt;span class="ident"&gt;bar1&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;do_something_else&lt;/span&gt; &lt;span class="symbol"&gt;:b7&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:b8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;You could argue that the namespace for Aquarium needs a little work and the availability of Aspect.new system wide should be a given, but adding that oneself until Aquarium has it is no big deal. I also didn&amp;#8217;t demonstrate pointcuts, another option to around, before and after. With a pointcut, you can encapsulate the type, scope and method names&amp;#8212;perhaps as a constant, class variable or class method to reduce dependencies.&lt;/p&gt;


	&lt;h3&gt;Overview&lt;/h3&gt;


	&lt;p&gt;All in all, the &lt;span class="caps"&gt;DSL&lt;/span&gt; is already miles better than anything else out there and Aquarium was only released to the public months ago. To summarise, I think this &lt;span class="caps"&gt;DSL&lt;/span&gt; is killer because it is&amp;#8230;&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;clear about what is affected&lt;/li&gt;
		&lt;li&gt;easy to separate from what is affected&lt;/li&gt;
		&lt;li&gt;rich with selectors (type, scope, name, pointcut)&lt;/li&gt;
		&lt;li&gt;able to choose whether to alter method execution&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;So, I would definitely suggest giving it a go and seeing how it can modularise some of your &amp;#8216;cross cutting concerns&amp;#8217;. I also suggest the Aquarium &lt;span class="caps"&gt;README&lt;/span&gt; and the reading recommended on its site, http://aquarium.rubyforge.org/.&lt;/p&gt;</description>
      <pubDate>Tue, 09 Oct 2007 21:51:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:f438f74a-16c8-4b1a-a3bd-8cf6c6c555c3</guid>
      <author>Mathew Abonyi</author>
      <link>http://www.mathewabonyi.com/articles/2007/10/09/metaprogramming-apply-aspects</link>
      <category>Discoveries</category>
      <category>Ruby</category>
      <category>aop</category>
      <category>aspects</category>
      <category>aquarium</category>
      <category>ruby</category>
      <category>discoveries</category>
      <category>metaprogramming</category>
      <trackback:ping>http://www.mathewabonyi.com/articles/trackback/55</trackback:ping>
    </item>
    <item>
      <title>"Metaprogramming.apply(Aspects)" by Mathew Abonyi</title>
      <description>&lt;p&gt;I am still around and watching the blog - or at least making sure it is alive and up - but there just hasn&amp;#8217;t been the time to post anything.&lt;/p&gt;


	&lt;p&gt;There have been a lot of utilities which I&amp;#8217;ve noticed and would like to post about; a lot of techniques I&amp;#8217;ve learned over the last year; a lot of changes to my own code that I&amp;#8217;d like to share. It&amp;#8217;s just about finding the time.&lt;/p&gt;


	&lt;p&gt;Thanks for the support&amp;#8212;I&amp;#8217;ll try to be more vocal in the near future when I&amp;#8217;ve freed up some time. I think realistically it&amp;#8217;ll be about a month from now before I&amp;#8217;m properly back, though.&lt;/p&gt;


Things I&amp;#8217;m considering posting about:
	&lt;ul&gt;
	&lt;li&gt;using EventMachine&lt;/li&gt;
		&lt;li&gt;using scraping toolkits&lt;/li&gt;
		&lt;li&gt;parsing &amp;#38; executing JavaScript in Ruby&lt;/li&gt;
		&lt;li&gt;writing simple servers&lt;/li&gt;
		&lt;li&gt;using Ragel for state machines&lt;/li&gt;
		&lt;li&gt;experimenting with Merb&lt;/li&gt;
		&lt;li&gt;using Git and Mercurial&lt;/li&gt;
		&lt;li&gt;writing recursive repository hooks&lt;/li&gt;
		&lt;li&gt;spiffy e-mail templates &amp;#38; repository syndication&lt;/li&gt;
		&lt;li&gt;(anything else you&amp;#8217;d like to hear about?)&lt;/li&gt;
	&lt;/ul&gt;</description>
      <pubDate>Tue, 06 May 2008 13:30:53 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:f8693d77-55c9-43a3-b1e4-37a1dab8b6aa</guid>
      <link>http://www.mathewabonyi.com/articles/2007/10/09/metaprogramming-apply-aspects#comment-89822</link>
    </item>
    <item>
      <title>"Metaprogramming.apply(Aspects)" by simplicoder</title>
      <description>&lt;p&gt;Was this silence aforementioned?&lt;/p&gt;


	&lt;p&gt;Oh well.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ve always enjoyed your blogs&amp;#8230; and creations.&lt;/p&gt;


	&lt;p&gt;Will continue to keep you in the feed reader.&lt;/p&gt;</description>
      <pubDate>Mon, 05 May 2008 23:34:37 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:5497746a-0adf-4cfc-a4b1-354b36c0579f</guid>
      <link>http://www.mathewabonyi.com/articles/2007/10/09/metaprogramming-apply-aspects#comment-89691</link>
    </item>
  </channel>
</rss>
