On Sun, 2 Apr 2006, Trans wrote:

> Thanks Daniel, I'll give this some consideration.
>
> A more interesting alternative that could soon come to pass is an
> extension to Facets' annotation system. Right now one can easily do:
>
>  require 'facet/annotation'
>
>  class Foo
>    attr_accessor :x
>    ann :x, :validation => proc { |x| ... }
>  end
>
> But this is nothing more than a note. For it to actually have any
> effect one would have to manually utilize the note. With then next
> version of annotation.rb I plan to add annotation hooks. By defining a
> hook you can automatically have it do what you would like when a
> particular annotation is define. For instance:
>
>  Annotation.annotation_action( :validation ) { |symbol, validator|
>    wrap_method( "#{symbol}=") { |target, x|
>      unless validator.call( x )
>        raise ArgumentError, "Invalid value provided for #{symbol}"
>      else
>        target.call(x)
>      end
>    }
>  }
>
> Now when you make the above annotation it will automatically generate
> the validating setter as you describe.
>
> The only downside to this kind of thing at the moment is the lack of an
> adequate AOP foundation built into Ruby.
>
> But all that is down the road yet. In the mean time I will likely add
> your method. Thanks.
>
> T.
>
> P.S. Using this list is fine, especially if you're interested in wider
> input from the Ruby community. You can also email the Nitro list
> --Facets is a key component of Nitro/Og. And of course you can always
> email me directly.

fyi.

   jib:~/eg/ruby/traits/traits-0.9.0 > irb
   irb(main):001:0> require 'traits'
   => true
   irb(main):002:0> trait :x, :validate => lambda{|x| Integer === x}
   => [["x", "x="]]
   irb(main):003:0> x
   => nil
   irb(main):004:0> x 42
   => 42
   irb(main):005:0> x
   => 42
   irb(main):006:0> x 42.0
   ArgumentError: validation of <42.0> failed!
           from (eval):98:in `x='
           from (eval):91:in `each'
           from (eval):91:in `x='
           from (eval):3:in `send'
           from (eval):3:in `x'
           from (irb):6
           from :0


steal what you like.

regards.

-a
-- 
share your knowledge.  it's a way to achieve immortality.
- h.h. the 14th dali lama