Module: Anise::Annotative::Variables
- Includes:
- Anise::Annotations
- Defined in:
- lib/anise/annotative/variables.rb
Overview
I bet you never imagined Ruby could suport ‘@style` annotations. Well, I am here to tell you otherwise.
The VariableAnnotator module allows class instance variable to be used method annotations which attach to the next defined method.
class X
extend Anise::Annotative::Variables
variable_annotator :@doc
variable_annotator :@returns
@doc = "See what I mean?"
@returns = NilClass
def see
puts "Yes, I see!"
end
end
X.ann(:see, :@doc) #=> "See what I mean?"
This library uses the #method_added callback, so be sure to respect good practices of calling super
if you need to override this method.
**IMPORTANT!!!** This library is an interesting expirement, but it remains to be determined if it makes sense for general use.
Instance Method Summary collapse
- #annotator(iv, &block) ⇒ Object
-
#method_added(sym) ⇒ Object
When a method is added, run all pending annotations.
-
#variable_annotator(iv, &block) ⇒ Object
Open method annotations.
Methods included from Anise::Annotations
#ann, #ann!, #annotation_added, #annotations
Instance Method Details
#annotator(iv, &block) ⇒ Object
58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/anise/annotative/variables.rb', line 58 def annotator(iv, &block) if not iv.to_s.start_with?('@') if defined?(super) super(iv, &block) else raise ArgumentError, "not a valid instance variable -- #{iv}" end else variable_annotator(iv, ns, &block) end end |
#method_added(sym) ⇒ Object
When a method is added, run all pending annotations.
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/anise/annotative/variables.rb', line 73 def method_added(sym) @_variable_annotations ||= {} @_variable_annotations.each do |iv, block| if iv.to_s.index('/') iv, ns = iv.to_s.split('/') else ns = :ann end value = instance_variable_get(iv) if block block.call(sym, value) else ann(sym/ns, iv=>value) end # TODO: can we undefine the instance variable? instance_variable_set(iv, nil) end super(sym) if defined?(super) end |
#variable_annotator(iv, &block) ⇒ Object
Open method annotations.
46 47 48 49 50 51 52 53 54 55 |
# File 'lib/anise/annotative/variables.rb', line 46 def variable_annotator(iv, &block) # TODO: should none iv raise an error instead? iv = "@#{iv}".to_sym if iv.to_s !~ /^@/ # TODO: use an annotation to record the annotators #ann(:variable_annotator, iv=>block) @_variable_annotations ||= {} @_variable_annotations[iv] = block end |