classx 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. data/ChangeLog +354 -0
  2. data/README +5 -0
  3. data/Rakefile +2 -2
  4. data/bench/attribute_get.rb +73 -0
  5. data/bench/attribute_set.rb +53 -19
  6. data/bench/define_attribute.rb +226 -0
  7. data/bench/initialize.rb +25 -7
  8. data/doc/output/coverage/index.html +74 -128
  9. data/doc/output/coverage/lib-classx-attribute_rb.html +291 -190
  10. data/doc/output/coverage/lib-classx-attributes_rb.html +167 -101
  11. data/doc/output/coverage/lib-classx-bracketable_rb.html +671 -0
  12. data/doc/output/coverage/lib-classx-class_attributes_rb.html +775 -0
  13. data/doc/output/coverage/lib-classx-commandable_rb.html +727 -0
  14. data/doc/output/coverage/{-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-block_rb.html → lib-classx-declare_rb.html} +60 -62
  15. data/doc/output/coverage/lib-classx-validate_rb.html +43 -41
  16. data/doc/output/coverage/lib-classx_rb.html +208 -78
  17. data/example/commandable.rb +1 -0
  18. data/lib/classx.rb +146 -16
  19. data/lib/classx/attribute.rb +244 -143
  20. data/lib/classx/attributes.rb +93 -27
  21. data/lib/classx/bracketable.rb +61 -0
  22. data/lib/classx/class_attributes.rb +165 -0
  23. data/lib/classx/commandable.rb +55 -4
  24. data/lib/classx/declare.rb +40 -3
  25. data/lib/classx/role/logger.rb +17 -13
  26. data/lib/classx/validate.rb +26 -24
  27. data/spec/classx/handles_spec.rb +21 -6
  28. data/spec/classx/serialize_spec.rb +57 -0
  29. data/spec/classx/{with_coerce.rb → with_coerce_spec.rb} +0 -0
  30. data/spec/classx/with_extend_spec.rb +58 -0
  31. data/spec/classx/with_include_spec.rb +58 -0
  32. data/spec/classx/with_validate_spec.rb +363 -0
  33. data/spec/classx/without_anyoption_spec.rb +1 -1
  34. data/spec/classx/writable_option_spec.rb +29 -4
  35. data/spec/classx_bracketable_spec.rb +160 -0
  36. data/spec/classx_class_attributes/default_option_spec.rb +121 -0
  37. data/spec/classx_class_attributes/dsl_accessor_spec.rb +88 -0
  38. data/spec/classx_class_attributes/handles_spec.rb +77 -0
  39. data/spec/classx_class_attributes/with_coerce_spec.rb +119 -0
  40. data/spec/classx_class_attributes/with_extend_spec.rb +64 -0
  41. data/spec/classx_class_attributes/with_include_spec.rb +64 -0
  42. data/spec/classx_class_attributes/with_multiple_class_spec.rb +60 -0
  43. data/spec/classx_class_attributes/with_validate_spec.rb +248 -0
  44. data/spec/classx_class_attributes/without_accessor_spec.rb +19 -0
  45. data/spec/classx_class_attributes/without_anyoption_spec.rb +21 -0
  46. data/spec/classx_class_attributes/writable_option_spec.rb +100 -0
  47. data/spec/classx_declare_spec.rb +117 -0
  48. data/spec/classx_validate_spec.rb +1 -3
  49. data/tasks/basic_tasks.rake +1 -1
  50. metadata +36 -26
  51. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-callbacks_rb.html +0 -932
  52. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-change_rb.html +0 -779
  53. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs-hunk_rb.html +0 -867
  54. data/doc/output/coverage/-Library-Ruby-Gems-gems-diff-lcs-1_1_2-lib-diff-lcs_rb.html +0 -1715
  55. data/doc/output/coverage/-Library-Ruby-Gems-gems-rcov-0_8_1_2_0-lib-rcov_rb.html +0 -1598
  56. data/spec/classx/with_extend.rb +0 -27
  57. data/spec/classx/with_include.rb +0 -27
@@ -553,7 +553,7 @@ span.run100 {
553
553
  </style>
554
554
  </head>
555
555
  <body><h3>C0 code coverage information</h3>
556
- <p>Generated on Sat Aug 23 14:29:20 +0900 2008 with <a href='http://eigenclass.org/hiki/rcov'>rcov 0.8.1.2</a>
556
+ <p>Generated on Sat Sep 13 00:31:29 +0900 2008 with <a href='http://eigenclass.org/hiki/rcov'>rcov 0.8.1.2</a>
557
557
  </p>
558
558
  <hr/>
559
559
  <pre><span class='marked0'>Code reported as executed by Ruby looks like this...
@@ -571,24 +571,24 @@ span.run100 {
571
571
  </thead>
572
572
  <tbody><tr class='light'><td><a href='lib-classx-attributes_rb.html'>lib/classx/attributes.rb</a>
573
573
  </td>
574
- <td class='lines_total'><tt>92</tt>
574
+ <td class='lines_total'><tt>158</tt>
575
575
  </td>
576
- <td class='lines_code'><tt>76</tt>
576
+ <td class='lines_code'><tt>94</tt>
577
577
  </td>
578
- <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>97.8%</tt>
578
+ <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>100.0%</tt>
579
579
  &nbsp;</td>
580
- <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='98'/>
581
- <td class='uncovered' width='2'/>
580
+ <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='100'/>
581
+ <td class='uncovered' width='0'/>
582
582
  </tr>
583
583
  </table>
584
584
  </td>
585
585
  </tr>
586
586
  </table>
587
587
  </td>
588
- <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>97.4%</tt>
588
+ <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>100.0%</tt>
589
589
  &nbsp;</td>
590
- <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='97'/>
591
- <td class='uncovered' width='3'/>
590
+ <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='100'/>
591
+ <td class='uncovered' width='0'/>
592
592
  </tr>
593
593
  </table>
594
594
  </td>
@@ -598,98 +598,164 @@ span.run100 {
598
598
  </tr>
599
599
  </tbody>
600
600
  </table>
601
- <pre><span class="marked1"><a name="line1"></a> 1 module ClassX
602
- </span><span class="marked0"><a name="line2"></a> 2 module Attributes
603
- </span><span class="marked1"><a name="line3"></a> 3 ATTRIBUTE_REGEX = /\Aattribute_of:(\w+)\z/
604
- </span><span class="inferred0"><a name="line4"></a> 4
605
- </span><span class="marked1"><a name="line5"></a> 5 def attribute_of
606
- </span><span class="marked0"><a name="line6"></a> 6 unless @__attribute_of
607
- </span><span class="marked1"><a name="line7"></a> 7 @__attribute_of = {}
608
- </span><span class="marked0"><a name="line8"></a> 8 private_instance_methods.select {|meth| meth.to_s =~ ATTRIBUTE_REGEX }.each do |meth|
609
- </span><span class="marked1"><a name="line9"></a> 9 key = meth.to_s.sub(ATTRIBUTE_REGEX) { $1 }
610
- </span><span class="marked0"><a name="line10"></a>10 @__attribute_of[key] = __send__ &quot;attribute_of:#{key}&quot;
611
- </span><span class="inferred1"><a name="line11"></a>11 end
612
- </span><span class="inferred0"><a name="line12"></a>12 end
613
- </span><span class="inferred1"><a name="line13"></a>13
614
- </span><span class="marked0"><a name="line14"></a>14 @__attribute_of
615
- </span><span class="inferred1"><a name="line15"></a>15 end
616
- </span><span class="inferred0"><a name="line16"></a>16
617
- </span><span class="marked1"><a name="line17"></a>17 private
618
- </span><span class="marked0"><a name="line18"></a>18 def define_attribute name, attribute
619
- </span><span class="marked1"><a name="line19"></a>19 klass_attribute = ClassX::AttributeFactory.create(attribute)
620
- </span><span class="marked0"><a name="line20"></a>20 mod = Module.new
621
- </span><span class="marked1"><a name="line21"></a>21 begin
622
- </span><span class="marked0"><a name="line22"></a>22 mod = self.const_get('ClassMethods')
623
- </span><span class="inferred1"><a name="line23"></a>23 rescue NameError =&gt; e
624
- </span><span class="marked0"><a name="line24"></a>24 mod = Module.new
625
- </span><span class="marked1"><a name="line25"></a>25 const_set('ClassMethods', mod)
626
- </span><span class="inferred0"><a name="line26"></a>26 end
627
- </span><span class="marked1"><a name="line27"></a>27 mod.module_eval do
628
- </span><span class="marked0"><a name="line28"></a>28 define_method &quot;attribute_of:#{name}&quot; do
629
- </span><span class="marked1"><a name="line29"></a>29 klass_attribute
630
- </span><span class="inferred0"><a name="line30"></a>30 end
631
- </span><span class="inferred1"><a name="line31"></a>31
632
- </span><span class="marked0"><a name="line32"></a>32 private &quot;attribute_of:#{name}&quot;
633
- </span><span class="inferred1"><a name="line33"></a>33 end
634
- </span><span class="marked0"><a name="line34"></a>34 self.extend(mod)
635
- </span><span class="marked1"><a name="line35"></a>35 @__attribute_of ||= self.attribute_of
636
- </span><span class="marked0"><a name="line36"></a>36 @__attribute_of[name] = klass_attribute
637
- </span><span class="inferred1"><a name="line37"></a>37
638
- </span><span class="marked0"><a name="line38"></a>38 define_method &quot;attribute_of:#{name}&quot; do
639
- </span><span class="marked1"><a name="line39"></a>39 @__attribute_of ||= {}
640
- </span><span class="marked0"><a name="line40"></a>40 @__attribute_of[name] ||= klass_attribute.new(self)
641
- </span><span class="inferred1"><a name="line41"></a>41 end
642
- </span><span class="inferred0"><a name="line42"></a>42
643
- </span><span class="marked1"><a name="line43"></a>43 private &quot;attribute_of:#{name}&quot;
644
- </span><span class="inferred0"><a name="line44"></a>44 end
645
- </span><span class="inferred1"><a name="line45"></a>45
646
- </span><span class="marked0"><a name="line46"></a>46 def add_attribute name, attrs={}
647
- </span><span class="marked1"><a name="line47"></a>47 name = name.to_s
648
- </span><span class="inferred0"><a name="line48"></a>48
649
- </span><span class="marked1"><a name="line49"></a>49 define_attribute(name, attrs)
650
- </span><span class="inferred0"><a name="line50"></a>50
651
- </span><span class="marked1"><a name="line51"></a>51 define_method name do
652
- </span><span class="marked0"><a name="line52"></a>52 attribute_of[name].get
653
- </span><span class="inferred1"><a name="line53"></a>53 end
654
- </span><span class="inferred0"><a name="line54"></a>54
655
- </span><span class="marked1"><a name="line55"></a>55 define_method &quot;#{name}=&quot; do |val|
656
- </span><span class="uncovered0"><a name="line56"></a>56 attribute_of[name].set val
657
- </span><span class="uncovered1"><a name="line57"></a>57 end
658
- </span><span class="inferred0"><a name="line58"></a>58
659
- </span><span class="marked1"><a name="line59"></a>59 cached_attribute_of = attribute_of
660
- </span><span class="marked0"><a name="line60"></a>60 if cached_attribute_of[name]
661
- </span><span class="marked1"><a name="line61"></a>61 unless cached_attribute_of[name].config[:writable]
662
- </span><span class="marked0"><a name="line62"></a>62 private &quot;#{name}=&quot;
663
- </span><span class="inferred1"><a name="line63"></a>63 end
664
- </span><span class="inferred0"><a name="line64"></a>64
665
- </span><span class="marked1"><a name="line65"></a>65 if cached_attribute_of[name].config[:handles]
666
- </span><span class="marked0"><a name="line66"></a>66 case cached_attribute_of[name].config[:handles]
667
- </span><span class="marked1"><a name="line67"></a>67 when Hash
668
- </span><span class="marked0"><a name="line68"></a>68 cached_attribute_of[name].config[:handles].each do |before, after|
669
- </span><span class="marked1"><a name="line69"></a>69 define_method before do
670
- </span><span class="marked0"><a name="line70"></a>70 attribute_of[name].get.__send__ after
671
- </span><span class="inferred1"><a name="line71"></a>71 end
672
- </span><span class="inferred0"><a name="line72"></a>72 end
673
- </span><span class="marked1"><a name="line73"></a>73 when Array
674
- </span><span class="marked0"><a name="line74"></a>74 cached_attribute_of[name].config[:handles].each do |meth|
675
- </span><span class="marked1"><a name="line75"></a>75 define_method meth do
676
- </span><span class="marked0"><a name="line76"></a>76 attribute_of[name].get.__send__ meth
677
- </span><span class="inferred1"><a name="line77"></a>77 end
678
- </span><span class="inferred0"><a name="line78"></a>78 end
679
- </span><span class="inferred1"><a name="line79"></a>79 end
680
- </span><span class="inferred0"><a name="line80"></a>80 end
681
- </span><span class="inferred1"><a name="line81"></a>81 end
682
- </span><span class="inferred0"><a name="line82"></a>82 end
683
- </span><span class="inferred1"><a name="line83"></a>83
684
- </span><span class="marked0"><a name="line84"></a>84 alias has add_attribute
685
- </span><span class="inferred1"><a name="line85"></a>85
686
- </span><span class="inferred0"><a name="line86"></a>86 # hook for module to ClassX base class.
687
- </span><span class="marked1"><a name="line87"></a>87 def included klass
688
- </span><span class="marked0"><a name="line88"></a>88 klass.extend(self.const_get('ClassMethods'))
689
- </span><span class="marked1"><a name="line89"></a>89 end
690
- </span><span class="inferred0"><a name="line90"></a>90
691
- </span><span class="inferred1"><a name="line91"></a>91 end
692
- </span><span class="inferred0"><a name="line92"></a>92 end
601
+ <pre><span class="marked0"><a name="line1"></a> 1 module ClassX
602
+ </span><span class="inferred1"><a name="line2"></a> 2 #
603
+ </span><span class="inferred0"><a name="line3"></a> 3 # added attribute feature to module.
604
+ </span><span class="inferred1"><a name="line4"></a> 4 #
605
+ </span><span class="inferred0"><a name="line5"></a> 5 # require 'classx'
606
+ </span><span class="inferred1"><a name="line6"></a> 6 # module YourApp::Role::SomeModule
607
+ </span><span class="inferred0"><a name="line7"></a> 7 # extend Attributes
608
+ </span><span class="inferred1"><a name="line8"></a> 8 #
609
+ </span><span class="inferred0"><a name="line9"></a> 9 # has :some_attr
610
+ </span><span class="inferred1"><a name="line10"></a> 10 #
611
+ </span><span class="inferred0"><a name="line11"></a> 11 # end
612
+ </span><span class="inferred1"><a name="line12"></a> 12 #
613
+ </span><span class="inferred0"><a name="line13"></a> 13 # class YourApp
614
+ </span><span class="inferred1"><a name="line14"></a> 14 # included ClassX
615
+ </span><span class="inferred0"><a name="line15"></a> 15 # included YourApp::Role::SomeModule
616
+ </span><span class="inferred1"><a name="line16"></a> 16 #
617
+ </span><span class="inferred0"><a name="line17"></a> 17 # end
618
+ </span><span class="inferred1"><a name="line18"></a> 18 #
619
+ </span><span class="inferred0"><a name="line19"></a> 19 # YourApp.new(:some_attr =&gt; 10)
620
+ </span><span class="inferred1"><a name="line20"></a> 20 #
621
+ </span><span class="marked0"><a name="line21"></a> 21 module Attributes
622
+ </span><span class="marked1"><a name="line22"></a> 22 ATTRIBUTE_REGEX = /\Aattribute_of:(\w+)\z/
623
+ </span><span class="inferred0"><a name="line23"></a> 23
624
+ </span><span class="inferred1"><a name="line24"></a> 24 # return Hash of attribute's name as a key and attribute's meta class as a value.
625
+ </span><span class="inferred0"><a name="line25"></a> 25 # for example,
626
+ </span><span class="inferred1"><a name="line26"></a> 26 #
627
+ </span><span class="inferred0"><a name="line27"></a> 27 # class YourClass
628
+ </span><span class="inferred1"><a name="line28"></a> 28 # include ClassX
629
+ </span><span class="inferred0"><a name="line29"></a> 29 # has :x
630
+ </span><span class="inferred1"><a name="line30"></a> 30 # end
631
+ </span><span class="inferred0"><a name="line31"></a> 31 #
632
+ </span><span class="inferred1"><a name="line32"></a> 32 # YourClass.attribute_of #=&gt; { &quot;x&quot; =&gt; &lt;ClassX::Attribute: ... &gt; }
633
+ </span><span class="inferred0"><a name="line33"></a> 33 #
634
+ </span><span class="marked1"><a name="line34"></a> 34 def attribute_of
635
+ </span><span class="marked0"><a name="line35"></a> 35 unless instance_variable_defined?('@__attribute_of') &amp;&amp; @__attribute_of
636
+ </span><span class="marked1"><a name="line36"></a> 36 @__attribute_of = {}
637
+ </span><span class="marked0"><a name="line37"></a> 37 private_instance_methods.select {|meth| meth.to_s =~ ATTRIBUTE_REGEX }.each do |meth|
638
+ </span><span class="marked1"><a name="line38"></a> 38 key = meth.to_s.sub(ATTRIBUTE_REGEX) { $1 }
639
+ </span><span class="marked0"><a name="line39"></a> 39 @__attribute_of[key] = __send__ &quot;attribute_of:#{key}&quot;
640
+ </span><span class="inferred1"><a name="line40"></a> 40 end
641
+ </span><span class="inferred0"><a name="line41"></a> 41 end
642
+ </span><span class="inferred1"><a name="line42"></a> 42
643
+ </span><span class="marked0"><a name="line43"></a> 43 @__attribute_of
644
+ </span><span class="inferred1"><a name="line44"></a> 44 end
645
+ </span><span class="inferred0"><a name="line45"></a> 45
646
+ </span><span class="marked1"><a name="line46"></a> 46 private
647
+ </span><span class="inferred0"><a name="line47"></a> 47 # generating attribute's meta class and bind to this class.
648
+ </span><span class="inferred1"><a name="line48"></a> 48 #
649
+ </span><span class="marked0"><a name="line49"></a> 49 def define_attribute name, attribute #:doc:
650
+ </span><span class="marked1"><a name="line50"></a> 50 klass_attribute = ClassX::AttributeFactory.create(attribute)
651
+ </span><span class="marked0"><a name="line51"></a> 51 mod = nil
652
+ </span><span class="marked1"><a name="line52"></a> 52 if self.const_defined? 'ClassMethods'
653
+ </span><span class="marked0"><a name="line53"></a> 53 mod = self.const_get('ClassMethods')
654
+ </span><span class="inferred1"><a name="line54"></a> 54 else
655
+ </span><span class="marked0"><a name="line55"></a> 55 mod = Module.new
656
+ </span><span class="marked1"><a name="line56"></a> 56 const_set('ClassMethods', mod)
657
+ </span><span class="inferred0"><a name="line57"></a> 57 end
658
+ </span><span class="marked1"><a name="line58"></a> 58 mod.module_eval do
659
+ </span><span class="marked0"><a name="line59"></a> 59 define_method &quot;attribute_of:#{name}&quot; do
660
+ </span><span class="marked1"><a name="line60"></a> 60 klass_attribute
661
+ </span><span class="inferred0"><a name="line61"></a> 61 end
662
+ </span><span class="inferred1"><a name="line62"></a> 62
663
+ </span><span class="marked0"><a name="line63"></a> 63 private &quot;attribute_of:#{name}&quot;
664
+ </span><span class="inferred1"><a name="line64"></a> 64 end
665
+ </span><span class="marked0"><a name="line65"></a> 65 self.extend(mod)
666
+ </span><span class="marked1"><a name="line66"></a> 66 @__attribute_of ||= self.attribute_of
667
+ </span><span class="marked0"><a name="line67"></a> 67 @__attribute_of[name] = klass_attribute
668
+ </span><span class="inferred1"><a name="line68"></a> 68
669
+ </span><span class="marked0"><a name="line69"></a> 69 define_method &quot;attribute_of:#{name}&quot; do
670
+ </span><span class="marked1"><a name="line70"></a> 70 @__attribute_of ||= {}
671
+ </span><span class="marked0"><a name="line71"></a> 71 @__attribute_of[name] ||= klass_attribute.new(self)
672
+ </span><span class="inferred1"><a name="line72"></a> 72 end
673
+ </span><span class="inferred0"><a name="line73"></a> 73
674
+ </span><span class="marked1"><a name="line74"></a> 74 private &quot;attribute_of:#{name}&quot;
675
+ </span><span class="inferred0"><a name="line75"></a> 75
676
+ </span><span class="marked1"><a name="line76"></a> 76 klass_attribute
677
+ </span><span class="inferred0"><a name="line77"></a> 77 end
678
+ </span><span class="inferred1"><a name="line78"></a> 78
679
+ </span><span class="inferred0"><a name="line79"></a> 79 # adding new attribute to class, and define accessor methods related to this attribute.
680
+ </span><span class="inferred1"><a name="line80"></a> 80 # You can also use +has+ more declaretivly.
681
+ </span><span class="inferred0"><a name="line81"></a> 81 #
682
+ </span><span class="inferred1"><a name="line82"></a> 82 # class YourClass
683
+ </span><span class="inferred0"><a name="line83"></a> 83 # include ClassX
684
+ </span><span class="inferred1"><a name="line84"></a> 84 # add_attribute :x,
685
+ </span><span class="inferred0"><a name="line85"></a> 85 # :writable =&gt; true, # defining accessor scope.
686
+ </span><span class="inferred1"><a name="line86"></a> 86 # :optional =&gt; ture, # defining attribute is required in initialize.
687
+ </span><span class="inferred0"><a name="line87"></a> 87 # :validate =&gt; proc {|val| val.respond_to? :to_s } # this attribute's value should adopted to this rule.
688
+ </span><span class="inferred1"><a name="line88"></a> 88 # :default =&gt; proc {|mine| mine.class.to_s.split(/::/).last.downcase } # default value for this attribute.
689
+ </span><span class="inferred0"><a name="line89"></a> 89 #
690
+ </span><span class="inferred1"><a name="line90"></a> 90 # end
691
+ </span><span class="inferred0"><a name="line91"></a> 91 #
692
+ </span><span class="marked1"><a name="line92"></a> 92 def add_attribute name, attrs={} #:doc:
693
+ </span><span class="marked0"><a name="line93"></a> 93 name = name.to_s
694
+ </span><span class="inferred1"><a name="line94"></a> 94
695
+ </span><span class="marked0"><a name="line95"></a> 95 attr_class = define_attribute(name, attrs)
696
+ </span><span class="inferred1"><a name="line96"></a> 96
697
+ </span><span class="inferred0"><a name="line97"></a> 97 # XXX: Why this can take *args?
698
+ </span><span class="inferred1"><a name="line98"></a> 98 # =&gt; It's for avoid warnings when you call it without values.
699
+ </span><span class="marked0"><a name="line99"></a> 99 define_method name do |*vals|
700
+ </span><span class="marked1"><a name="line100"></a>100 if vals == []
701
+ </span><span class="marked0"><a name="line101"></a>101 @__attribute_data_of ||= {}
702
+ </span><span class="marked1"><a name="line102"></a>102 if @__attribute_data_of[name]
703
+ </span><span class="marked0"><a name="line103"></a>103 return @__attribute_data_of[name]
704
+ </span><span class="inferred1"><a name="line104"></a>104 else
705
+ </span><span class="marked0"><a name="line105"></a>105 attr_instance = __send__ &quot;attribute_of:#{name}&quot;
706
+ </span><span class="marked1"><a name="line106"></a>106 return @__attribute_data_of[name] = attr_instance.get
707
+ </span><span class="inferred0"><a name="line107"></a>107 end
708
+ </span><span class="inferred1"><a name="line108"></a>108 else
709
+ </span><span class="marked0"><a name="line109"></a>109 raise ArgumentError if vals.size &gt; 1
710
+ </span><span class="marked1"><a name="line110"></a>110 val = vals.first
711
+ </span><span class="marked0"><a name="line111"></a>111 if respond_to? &quot;#{name}=&quot;
712
+ </span><span class="marked1"><a name="line112"></a>112 __send__ &quot;#{name}=&quot;, val
713
+ </span><span class="inferred0"><a name="line113"></a>113 else
714
+ </span><span class="marked1"><a name="line114"></a>114 raise RuntimeError, &quot;:#{name} is not writable&quot;
715
+ </span><span class="inferred0"><a name="line115"></a>115 end
716
+ </span><span class="inferred1"><a name="line116"></a>116 end
717
+ </span><span class="inferred0"><a name="line117"></a>117 end
718
+ </span><span class="inferred1"><a name="line118"></a>118
719
+ </span><span class="marked0"><a name="line119"></a>119 define_method &quot;#{name}=&quot; do |val|
720
+ </span><span class="marked1"><a name="line120"></a>120 attr_instance = __send__ &quot;attribute_of:#{name}&quot;
721
+ </span><span class="marked0"><a name="line121"></a>121 attr_instance.set val
722
+ </span><span class="marked1"><a name="line122"></a>122 @__attribute_data_of ||= {}
723
+ </span><span class="marked0"><a name="line123"></a>123 @__attribute_data_of[name] = val
724
+ </span><span class="inferred1"><a name="line124"></a>124 end
725
+ </span><span class="inferred0"><a name="line125"></a>125
726
+ </span><span class="marked1"><a name="line126"></a>126 unless attr_class.config[:writable]
727
+ </span><span class="marked0"><a name="line127"></a>127 private &quot;#{name}=&quot;
728
+ </span><span class="inferred1"><a name="line128"></a>128 end
729
+ </span><span class="inferred0"><a name="line129"></a>129
730
+ </span><span class="marked1"><a name="line130"></a>130 if attr_class.config[:handles]
731
+ </span><span class="marked0"><a name="line131"></a>131 case attr_class.config[:handles]
732
+ </span><span class="marked1"><a name="line132"></a>132 when Hash
733
+ </span><span class="marked0"><a name="line133"></a>133 attr_class.config[:handles].each do |before, after|
734
+ </span><span class="marked1"><a name="line134"></a>134 define_method before do |*args|
735
+ </span><span class="marked0"><a name="line135"></a>135 __send__(&quot;#{name}&quot;).__send__ after, *args
736
+ </span><span class="inferred1"><a name="line136"></a>136 end
737
+ </span><span class="inferred0"><a name="line137"></a>137 end
738
+ </span><span class="marked1"><a name="line138"></a>138 when Array
739
+ </span><span class="marked0"><a name="line139"></a>139 attr_class.config[:handles].each do |meth|
740
+ </span><span class="marked1"><a name="line140"></a>140 define_method meth do |*args|
741
+ </span><span class="marked0"><a name="line141"></a>141 __send__(&quot;#{name}&quot;).__send__ meth, *args
742
+ </span><span class="inferred1"><a name="line142"></a>142 end
743
+ </span><span class="inferred0"><a name="line143"></a>143 end
744
+ </span><span class="inferred1"><a name="line144"></a>144 end
745
+ </span><span class="inferred0"><a name="line145"></a>145 end
746
+ </span><span class="inferred1"><a name="line146"></a>146 end
747
+ </span><span class="inferred0"><a name="line147"></a>147
748
+ </span><span class="marked1"><a name="line148"></a>148 alias has add_attribute
749
+ </span><span class="inferred0"><a name="line149"></a>149
750
+ </span><span class="inferred1"><a name="line150"></a>150 # hook for module to ClassX base class.
751
+ </span><span class="marked0"><a name="line151"></a>151 def included klass
752
+ </span><span class="marked1"><a name="line152"></a>152 klass.extend(self.const_get('ClassMethods'))
753
+ </span><span class="marked0"><a name="line153"></a>153 end
754
+ </span><span class="inferred1"><a name="line154"></a>154
755
+ </span><span class="inferred0"><a name="line155"></a>155 # alias for lazy people
756
+ </span><span class="marked1"><a name="line156"></a>156 Attrs = Attributes
757
+ </span><span class="inferred0"><a name="line157"></a>157 end
758
+ </span><span class="inferred1"><a name="line158"></a>158 end
693
759
  </span></pre><hr/>
694
760
  <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a>
695
761
  version 0.8.1.2.</p>
@@ -0,0 +1,671 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html lang='en' xml:lang='en' xmlns='http://www.w3.org/1999/xhtml'><head><title>lib/classx/bracketable.rb - C0 code coverage information</title>
3
+ <style type='text/css'>body { background-color: rgb(240, 240, 245); }</style>
4
+ <style type='text/css'>span.cross-ref-title {
5
+ font-size: 140%;
6
+ }
7
+ span.cross-ref a {
8
+ text-decoration: none;
9
+ }
10
+ span.cross-ref {
11
+ background-color:#f3f7fa;
12
+ border: 1px dashed #333;
13
+ margin: 1em;
14
+ padding: 0.5em;
15
+ overflow: hidden;
16
+ }
17
+ a.crossref-toggle {
18
+ text-decoration: none;
19
+ }
20
+ span.marked0 {
21
+ background-color: rgb(185, 210, 200);
22
+ display: block;
23
+ }
24
+ span.marked1 {
25
+ background-color: rgb(190, 215, 205);
26
+ display: block;
27
+ }
28
+ span.inferred0 {
29
+ background-color: rgb(175, 200, 200);
30
+ display: block;
31
+ }
32
+ span.inferred1 {
33
+ background-color: rgb(180, 205, 205);
34
+ display: block;
35
+ }
36
+ span.uncovered0 {
37
+ background-color: rgb(225, 110, 110);
38
+ display: block;
39
+ }
40
+ span.uncovered1 {
41
+ background-color: rgb(235, 120, 120);
42
+ display: block;
43
+ }
44
+ span.overview {
45
+ border-bottom: 8px solid black;
46
+ }
47
+ div.overview {
48
+ border-bottom: 8px solid black;
49
+ }
50
+ body {
51
+ font-family: verdana, arial, helvetica;
52
+ }
53
+ div.footer {
54
+ font-size: 68%;
55
+ margin-top: 1.5em;
56
+ }
57
+ h1, h2, h3, h4, h5, h6 {
58
+ margin-bottom: 0.5em;
59
+ }
60
+ h5 {
61
+ margin-top: 0.5em;
62
+ }
63
+ .hidden {
64
+ display: none;
65
+ }
66
+ div.separator {
67
+ height: 10px;
68
+ }
69
+ /* Commented out for better readability, esp. on IE */
70
+ /*
71
+ table tr td, table tr th {
72
+ font-size: 68%;
73
+ }
74
+ td.value table tr td {
75
+ font-size: 11px;
76
+ }
77
+ */
78
+ table.percent_graph {
79
+ height: 12px;
80
+ border: #808080 1px solid;
81
+ empty-cells: show;
82
+ }
83
+ table.percent_graph td.covered {
84
+ height: 10px;
85
+ background: #00f000;
86
+ }
87
+ table.percent_graph td.uncovered {
88
+ height: 10px;
89
+ background: #e00000;
90
+ }
91
+ table.percent_graph td.NA {
92
+ height: 10px;
93
+ background: #eaeaea;
94
+ }
95
+ table.report {
96
+ border-collapse: collapse;
97
+ width: 100%;
98
+ }
99
+ table.report td.heading {
100
+ background: #dcecff;
101
+ border: #d0d0d0 1px solid;
102
+ font-weight: bold;
103
+ text-align: center;
104
+ }
105
+ table.report td.heading:hover {
106
+ background: #c0ffc0;
107
+ }
108
+ table.report td.text {
109
+ border: #d0d0d0 1px solid;
110
+ }
111
+ table.report td.value,
112
+ table.report td.lines_total,
113
+ table.report td.lines_code {
114
+ text-align: right;
115
+ border: #d0d0d0 1px solid;
116
+ }
117
+ table.report tr.light {
118
+ background-color: rgb(240, 240, 245);
119
+ }
120
+ table.report tr.dark {
121
+ background-color: rgb(230, 230, 235);
122
+ }
123
+ </style>
124
+ <script type='text/javascript'>
125
+ // <![CDATA[
126
+ function toggleCode( id ) {
127
+ if ( document.getElementById )
128
+ elem = document.getElementById( id );
129
+ else if ( document.all )
130
+ elem = eval( "document.all." + id );
131
+ else
132
+ return false;
133
+
134
+ elemStyle = elem.style;
135
+
136
+ if ( elemStyle.display != "block" ) {
137
+ elemStyle.display = "block"
138
+ } else {
139
+ elemStyle.display = "none"
140
+ }
141
+
142
+ return true;
143
+ }
144
+
145
+ // Make cross-references hidden by default
146
+ document.writeln( "<style type=\"text/css\">span.cross-ref { display: none }</style>" )
147
+ // ]]>
148
+ </script>
149
+ <style type='text/css'>span.run0 {
150
+ background-color: rgb(178, 204, 255);
151
+ display: block;
152
+ }
153
+ span.run1 {
154
+ background-color: rgb(178, 206, 255);
155
+ display: block;
156
+ }
157
+ span.run2 {
158
+ background-color: rgb(178, 209, 255);
159
+ display: block;
160
+ }
161
+ span.run3 {
162
+ background-color: rgb(178, 211, 255);
163
+ display: block;
164
+ }
165
+ span.run4 {
166
+ background-color: rgb(178, 214, 255);
167
+ display: block;
168
+ }
169
+ span.run5 {
170
+ background-color: rgb(178, 218, 255);
171
+ display: block;
172
+ }
173
+ span.run6 {
174
+ background-color: rgb(178, 220, 255);
175
+ display: block;
176
+ }
177
+ span.run7 {
178
+ background-color: rgb(178, 223, 255);
179
+ display: block;
180
+ }
181
+ span.run8 {
182
+ background-color: rgb(178, 225, 255);
183
+ display: block;
184
+ }
185
+ span.run9 {
186
+ background-color: rgb(178, 228, 255);
187
+ display: block;
188
+ }
189
+ span.run10 {
190
+ background-color: rgb(178, 232, 255);
191
+ display: block;
192
+ }
193
+ span.run11 {
194
+ background-color: rgb(178, 234, 255);
195
+ display: block;
196
+ }
197
+ span.run12 {
198
+ background-color: rgb(178, 237, 255);
199
+ display: block;
200
+ }
201
+ span.run13 {
202
+ background-color: rgb(178, 239, 255);
203
+ display: block;
204
+ }
205
+ span.run14 {
206
+ background-color: rgb(178, 242, 255);
207
+ display: block;
208
+ }
209
+ span.run15 {
210
+ background-color: rgb(178, 246, 255);
211
+ display: block;
212
+ }
213
+ span.run16 {
214
+ background-color: rgb(178, 248, 255);
215
+ display: block;
216
+ }
217
+ span.run17 {
218
+ background-color: rgb(178, 251, 255);
219
+ display: block;
220
+ }
221
+ span.run18 {
222
+ background-color: rgb(178, 253, 255);
223
+ display: block;
224
+ }
225
+ span.run19 {
226
+ background-color: rgb(178, 255, 253);
227
+ display: block;
228
+ }
229
+ span.run20 {
230
+ background-color: rgb(178, 255, 249);
231
+ display: block;
232
+ }
233
+ span.run21 {
234
+ background-color: rgb(178, 255, 247);
235
+ display: block;
236
+ }
237
+ span.run22 {
238
+ background-color: rgb(178, 255, 244);
239
+ display: block;
240
+ }
241
+ span.run23 {
242
+ background-color: rgb(178, 255, 242);
243
+ display: block;
244
+ }
245
+ span.run24 {
246
+ background-color: rgb(178, 255, 239);
247
+ display: block;
248
+ }
249
+ span.run25 {
250
+ background-color: rgb(178, 255, 235);
251
+ display: block;
252
+ }
253
+ span.run26 {
254
+ background-color: rgb(178, 255, 233);
255
+ display: block;
256
+ }
257
+ span.run27 {
258
+ background-color: rgb(178, 255, 230);
259
+ display: block;
260
+ }
261
+ span.run28 {
262
+ background-color: rgb(178, 255, 228);
263
+ display: block;
264
+ }
265
+ span.run29 {
266
+ background-color: rgb(178, 255, 225);
267
+ display: block;
268
+ }
269
+ span.run30 {
270
+ background-color: rgb(178, 255, 221);
271
+ display: block;
272
+ }
273
+ span.run31 {
274
+ background-color: rgb(178, 255, 219);
275
+ display: block;
276
+ }
277
+ span.run32 {
278
+ background-color: rgb(178, 255, 216);
279
+ display: block;
280
+ }
281
+ span.run33 {
282
+ background-color: rgb(178, 255, 214);
283
+ display: block;
284
+ }
285
+ span.run34 {
286
+ background-color: rgb(178, 255, 211);
287
+ display: block;
288
+ }
289
+ span.run35 {
290
+ background-color: rgb(178, 255, 207);
291
+ display: block;
292
+ }
293
+ span.run36 {
294
+ background-color: rgb(178, 255, 205);
295
+ display: block;
296
+ }
297
+ span.run37 {
298
+ background-color: rgb(178, 255, 202);
299
+ display: block;
300
+ }
301
+ span.run38 {
302
+ background-color: rgb(178, 255, 200);
303
+ display: block;
304
+ }
305
+ span.run39 {
306
+ background-color: rgb(178, 255, 197);
307
+ display: block;
308
+ }
309
+ span.run40 {
310
+ background-color: rgb(178, 255, 193);
311
+ display: block;
312
+ }
313
+ span.run41 {
314
+ background-color: rgb(178, 255, 191);
315
+ display: block;
316
+ }
317
+ span.run42 {
318
+ background-color: rgb(178, 255, 188);
319
+ display: block;
320
+ }
321
+ span.run43 {
322
+ background-color: rgb(178, 255, 186);
323
+ display: block;
324
+ }
325
+ span.run44 {
326
+ background-color: rgb(178, 255, 183);
327
+ display: block;
328
+ }
329
+ span.run45 {
330
+ background-color: rgb(178, 255, 179);
331
+ display: block;
332
+ }
333
+ span.run46 {
334
+ background-color: rgb(179, 255, 178);
335
+ display: block;
336
+ }
337
+ span.run47 {
338
+ background-color: rgb(182, 255, 178);
339
+ display: block;
340
+ }
341
+ span.run48 {
342
+ background-color: rgb(184, 255, 178);
343
+ display: block;
344
+ }
345
+ span.run49 {
346
+ background-color: rgb(187, 255, 178);
347
+ display: block;
348
+ }
349
+ span.run50 {
350
+ background-color: rgb(191, 255, 178);
351
+ display: block;
352
+ }
353
+ span.run51 {
354
+ background-color: rgb(193, 255, 178);
355
+ display: block;
356
+ }
357
+ span.run52 {
358
+ background-color: rgb(196, 255, 178);
359
+ display: block;
360
+ }
361
+ span.run53 {
362
+ background-color: rgb(198, 255, 178);
363
+ display: block;
364
+ }
365
+ span.run54 {
366
+ background-color: rgb(201, 255, 178);
367
+ display: block;
368
+ }
369
+ span.run55 {
370
+ background-color: rgb(205, 255, 178);
371
+ display: block;
372
+ }
373
+ span.run56 {
374
+ background-color: rgb(207, 255, 178);
375
+ display: block;
376
+ }
377
+ span.run57 {
378
+ background-color: rgb(210, 255, 178);
379
+ display: block;
380
+ }
381
+ span.run58 {
382
+ background-color: rgb(212, 255, 178);
383
+ display: block;
384
+ }
385
+ span.run59 {
386
+ background-color: rgb(215, 255, 178);
387
+ display: block;
388
+ }
389
+ span.run60 {
390
+ background-color: rgb(219, 255, 178);
391
+ display: block;
392
+ }
393
+ span.run61 {
394
+ background-color: rgb(221, 255, 178);
395
+ display: block;
396
+ }
397
+ span.run62 {
398
+ background-color: rgb(224, 255, 178);
399
+ display: block;
400
+ }
401
+ span.run63 {
402
+ background-color: rgb(226, 255, 178);
403
+ display: block;
404
+ }
405
+ span.run64 {
406
+ background-color: rgb(229, 255, 178);
407
+ display: block;
408
+ }
409
+ span.run65 {
410
+ background-color: rgb(233, 255, 178);
411
+ display: block;
412
+ }
413
+ span.run66 {
414
+ background-color: rgb(235, 255, 178);
415
+ display: block;
416
+ }
417
+ span.run67 {
418
+ background-color: rgb(238, 255, 178);
419
+ display: block;
420
+ }
421
+ span.run68 {
422
+ background-color: rgb(240, 255, 178);
423
+ display: block;
424
+ }
425
+ span.run69 {
426
+ background-color: rgb(243, 255, 178);
427
+ display: block;
428
+ }
429
+ span.run70 {
430
+ background-color: rgb(247, 255, 178);
431
+ display: block;
432
+ }
433
+ span.run71 {
434
+ background-color: rgb(249, 255, 178);
435
+ display: block;
436
+ }
437
+ span.run72 {
438
+ background-color: rgb(252, 255, 178);
439
+ display: block;
440
+ }
441
+ span.run73 {
442
+ background-color: rgb(255, 255, 178);
443
+ display: block;
444
+ }
445
+ span.run74 {
446
+ background-color: rgb(255, 252, 178);
447
+ display: block;
448
+ }
449
+ span.run75 {
450
+ background-color: rgb(255, 248, 178);
451
+ display: block;
452
+ }
453
+ span.run76 {
454
+ background-color: rgb(255, 246, 178);
455
+ display: block;
456
+ }
457
+ span.run77 {
458
+ background-color: rgb(255, 243, 178);
459
+ display: block;
460
+ }
461
+ span.run78 {
462
+ background-color: rgb(255, 240, 178);
463
+ display: block;
464
+ }
465
+ span.run79 {
466
+ background-color: rgb(255, 238, 178);
467
+ display: block;
468
+ }
469
+ span.run80 {
470
+ background-color: rgb(255, 234, 178);
471
+ display: block;
472
+ }
473
+ span.run81 {
474
+ background-color: rgb(255, 232, 178);
475
+ display: block;
476
+ }
477
+ span.run82 {
478
+ background-color: rgb(255, 229, 178);
479
+ display: block;
480
+ }
481
+ span.run83 {
482
+ background-color: rgb(255, 226, 178);
483
+ display: block;
484
+ }
485
+ span.run84 {
486
+ background-color: rgb(255, 224, 178);
487
+ display: block;
488
+ }
489
+ span.run85 {
490
+ background-color: rgb(255, 220, 178);
491
+ display: block;
492
+ }
493
+ span.run86 {
494
+ background-color: rgb(255, 218, 178);
495
+ display: block;
496
+ }
497
+ span.run87 {
498
+ background-color: rgb(255, 215, 178);
499
+ display: block;
500
+ }
501
+ span.run88 {
502
+ background-color: rgb(255, 212, 178);
503
+ display: block;
504
+ }
505
+ span.run89 {
506
+ background-color: rgb(255, 210, 178);
507
+ display: block;
508
+ }
509
+ span.run90 {
510
+ background-color: rgb(255, 206, 178);
511
+ display: block;
512
+ }
513
+ span.run91 {
514
+ background-color: rgb(255, 204, 178);
515
+ display: block;
516
+ }
517
+ span.run92 {
518
+ background-color: rgb(255, 201, 178);
519
+ display: block;
520
+ }
521
+ span.run93 {
522
+ background-color: rgb(255, 198, 178);
523
+ display: block;
524
+ }
525
+ span.run94 {
526
+ background-color: rgb(255, 196, 178);
527
+ display: block;
528
+ }
529
+ span.run95 {
530
+ background-color: rgb(255, 192, 178);
531
+ display: block;
532
+ }
533
+ span.run96 {
534
+ background-color: rgb(255, 189, 178);
535
+ display: block;
536
+ }
537
+ span.run97 {
538
+ background-color: rgb(255, 187, 178);
539
+ display: block;
540
+ }
541
+ span.run98 {
542
+ background-color: rgb(255, 184, 178);
543
+ display: block;
544
+ }
545
+ span.run99 {
546
+ background-color: rgb(255, 182, 178);
547
+ display: block;
548
+ }
549
+ span.run100 {
550
+ background-color: rgb(255, 178, 178);
551
+ display: block;
552
+ }
553
+ </style>
554
+ </head>
555
+ <body><h3>C0 code coverage information</h3>
556
+ <p>Generated on Sat Sep 13 00:31:29 +0900 2008 with <a href='http://eigenclass.org/hiki/rcov'>rcov 0.8.1.2</a>
557
+ </p>
558
+ <hr/>
559
+ <pre><span class='marked0'>Code reported as executed by Ruby looks like this...
560
+ </span><span class='marked1'>and this: this line is also marked as covered.
561
+ </span><span class='inferred0'>Lines considered as run by rcov, but not reported by Ruby, look like this,
562
+ </span><span class='inferred1'>and this: these lines were inferred by rcov (using simple heuristics).
563
+ </span><span class='uncovered0'>Finally, here&apos;s a line marked as not executed.
564
+ </span></pre>
565
+ <table class='report'><thead><tr><td class='heading'>Name</td>
566
+ <td class='heading'>Total lines</td>
567
+ <td class='heading'>Lines of code</td>
568
+ <td class='heading'>Total coverage</td>
569
+ <td class='heading'>Code coverage</td>
570
+ </tr>
571
+ </thead>
572
+ <tbody><tr class='light'><td><a href='lib-classx-bracketable_rb.html'>lib/classx/bracketable.rb</a>
573
+ </td>
574
+ <td class='lines_total'><tt>61</tt>
575
+ </td>
576
+ <td class='lines_code'><tt>34</tt>
577
+ </td>
578
+ <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>100.0%</tt>
579
+ &nbsp;</td>
580
+ <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='100'/>
581
+ <td class='uncovered' width='0'/>
582
+ </tr>
583
+ </table>
584
+ </td>
585
+ </tr>
586
+ </table>
587
+ </td>
588
+ <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>100.0%</tt>
589
+ &nbsp;</td>
590
+ <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='100'/>
591
+ <td class='uncovered' width='0'/>
592
+ </tr>
593
+ </table>
594
+ </td>
595
+ </tr>
596
+ </table>
597
+ </td>
598
+ </tr>
599
+ </tbody>
600
+ </table>
601
+ <pre><span class="marked0"><a name="line1"></a> 1 module ClassX
602
+ </span><span class="inferred1"><a name="line2"></a> 2 # you can access attribute using Hash like interface.
603
+ </span><span class="inferred0"><a name="line3"></a> 3 # class YourClass
604
+ </span><span class="inferred1"><a name="line4"></a> 4 # include ClassX
605
+ </span><span class="inferred0"><a name="line5"></a> 5 # include ClassX::Bracketable
606
+ </span><span class="inferred1"><a name="line6"></a> 6 # has :x
607
+ </span><span class="inferred0"><a name="line7"></a> 7 # end
608
+ </span><span class="inferred1"><a name="line8"></a> 8 #
609
+ </span><span class="inferred0"><a name="line9"></a> 9 # your = YourClass.new(:x =&gt; 20)
610
+ </span><span class="inferred1"><a name="line10"></a>10 # your[:x] #=&gt; 20
611
+ </span><span class="inferred0"><a name="line11"></a>11 # your[:x] = 30
612
+ </span><span class="inferred1"><a name="line12"></a>12 # your[:x] #=&gt; 30
613
+ </span><span class="inferred0"><a name="line13"></a>13 #
614
+ </span><span class="inferred1"><a name="line14"></a>14 # you can also use for class attribute
615
+ </span><span class="inferred0"><a name="line15"></a>15 #
616
+ </span><span class="inferred1"><a name="line16"></a>16 # class YourClass
617
+ </span><span class="inferred0"><a name="line17"></a>17 # extend ClssX::CAttrs
618
+ </span><span class="inferred1"><a name="line18"></a>18 # extend ClassX::Bracketable
619
+ </span><span class="inferred0"><a name="line19"></a>19 #
620
+ </span><span class="inferred1"><a name="line20"></a>20 # class_has :x
621
+ </span><span class="inferred0"><a name="line21"></a>21 # end
622
+ </span><span class="inferred1"><a name="line22"></a>22 #
623
+ </span><span class="inferred0"><a name="line23"></a>23 # YourClass[:x] = 20
624
+ </span><span class="inferred1"><a name="line24"></a>24 # YourClass[:x] #=&gt; 20
625
+ </span><span class="inferred0"><a name="line25"></a>25 #
626
+ </span><span class="marked1"><a name="line26"></a>26 module Bracketable
627
+ </span><span class="marked0"><a name="line27"></a>27 def [] name
628
+ </span><span class="marked1"><a name="line28"></a>28 attr_meth = nil
629
+ </span><span class="marked0"><a name="line29"></a>29 if respond_to? :class_attribute_of, true
630
+ </span><span class="marked1"><a name="line30"></a>30 attr_meth = :class_attribute_of
631
+ </span><span class="marked0"><a name="line31"></a>31 elsif respond_to? :attribute_of, true
632
+ </span><span class="marked1"><a name="line32"></a>32 attr_meth = :attribute_of
633
+ </span><span class="inferred0"><a name="line33"></a>33 else
634
+ </span><span class="marked1"><a name="line34"></a>34 return nil
635
+ </span><span class="inferred0"><a name="line35"></a>35 end
636
+ </span><span class="inferred1"><a name="line36"></a>36
637
+ </span><span class="marked0"><a name="line37"></a>37 if __send__(attr_meth).keys.include? name.to_s
638
+ </span><span class="marked1"><a name="line38"></a>38 __send__ name
639
+ </span><span class="inferred0"><a name="line39"></a>39 else
640
+ </span><span class="marked1"><a name="line40"></a>40 nil
641
+ </span><span class="inferred0"><a name="line41"></a>41 end
642
+ </span><span class="inferred1"><a name="line42"></a>42 end
643
+ </span><span class="inferred0"><a name="line43"></a>43
644
+ </span><span class="marked1"><a name="line44"></a>44 def []= name, val
645
+ </span><span class="marked0"><a name="line45"></a>45 attr_meth = nil
646
+ </span><span class="marked1"><a name="line46"></a>46 if respond_to? :class_attribute_of, true
647
+ </span><span class="marked0"><a name="line47"></a>47 attr_meth = :class_attribute_of
648
+ </span><span class="marked1"><a name="line48"></a>48 elsif respond_to? :attribute_of, true
649
+ </span><span class="marked0"><a name="line49"></a>49 attr_meth = :attribute_of
650
+ </span><span class="inferred1"><a name="line50"></a>50 else
651
+ </span><span class="marked0"><a name="line51"></a>51 return nil
652
+ </span><span class="inferred1"><a name="line52"></a>52 end
653
+ </span><span class="inferred0"><a name="line53"></a>53
654
+ </span><span class="marked1"><a name="line54"></a>54 if __send__(attr_meth).keys.include?(name.to_s) &amp;&amp; respond_to?(&quot;#{name.to_s}=&quot;)
655
+ </span><span class="marked0"><a name="line55"></a>55 __send__ &quot;#{name.to_s}=&quot;, val
656
+ </span><span class="inferred1"><a name="line56"></a>56 else
657
+ </span><span class="marked0"><a name="line57"></a>57 raise NoMethodError, &quot;:#{name} is private, or missing&quot;
658
+ </span><span class="inferred1"><a name="line58"></a>58 end
659
+ </span><span class="inferred0"><a name="line59"></a>59 end
660
+ </span><span class="inferred1"><a name="line60"></a>60 end
661
+ </span><span class="inferred0"><a name="line61"></a>61 end
662
+ </span></pre><hr/>
663
+ <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a>
664
+ version 0.8.1.2.</p>
665
+ <p><a href='http://validator.w3.org/check/referer'><img src='http://www.w3.org/Icons/valid-xhtml10' height='31' alt='Valid XHTML 1.0!' width='88'/>
666
+ </a>
667
+ <a href='http://jigsaw.w3.org/css-validator/check/referer'><img src='http://jigsaw.w3.org/css-validator/images/vcss' alt='Valid CSS!' style='border:0;width:88px;height:31px'/>
668
+ </a>
669
+ </p>
670
+ </body>
671
+ </html>