From: Daniel Sheppard Date: 2005-10-27T15:32:25+09:00 Subject: Re: Meta methods to govern meta data? The following is an implementation I just whipped up of annotation. - annotations are cascaded up through superclasses. - no way to remove an annotation (could override with a nil value though...) - allows you to use this syntax: class Dude annotate :a => :b def get_jiggy end end to annotate the method, which I think is much nicer than "annotate :get_jiggy, :a => :b", though that method is also available. This, however introduces a dependency on method_added not being overridden which I don't know how to avoid. ----- class Module def annotate(*args) hash = case args.length when 2: annotation_hash[args[0]].update(args[1]) when 1: x = class_eval("@@__meta_next_update ||= {}") x.update(args[0]) else raise ArgumentError, "wrong number of arguments (#{args.length})" end end def annotation_hash class_eval("@@__meta ||= Hash.new {|h,k| h[k]={}}") end private :annotation_hash def annotations(symbol) symbol = symbol.intern unless Symbol === symbol my_hash = annotation_hash[symbol] my_hash = superclass.annotations(symbol).merge(my_hash) if superclass my_hash end #it's nice to be able to annotate without naming the method (just apply it to the next method added) def method_added(symbol) meta_hash = annotation_hash[symbol] new_hash = class_eval("x = @@__meta_next_update||=nil; @@__meta_next_update = nil;x") meta_hash.update(new_hash) if new_hash end end ##################################################################################### This email has been scanned by MailMarshal, an email content filter. #####################################################################################