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:19 +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-attribute_rb.html'>lib/classx/attribute.rb</a>
573
573
  </td>
574
- <td class='lines_total'><tt>185</tt>
574
+ <td class='lines_total'><tt>286</tt>
575
575
  </td>
576
- <td class='lines_code'><tt>149</tt>
576
+ <td class='lines_code'><tt>221</tt>
577
577
  </td>
578
- <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>53.0%</tt>
578
+ <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_total'>98.6%</tt>
579
579
  &nbsp;</td>
580
- <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='53'/>
581
- <td class='uncovered' width='47'/>
580
+ <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='99'/>
581
+ <td class='uncovered' width='1'/>
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'>45.6%</tt>
588
+ <td><table cellspacing='0' cellpadding='0' align='right'><tr><td><tt class='coverage_code'>98.2%</tt>
589
589
  &nbsp;</td>
590
- <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='46'/>
591
- <td class='uncovered' width='54'/>
590
+ <td><table cellspacing='0' class='percent_graph' cellpadding='0' width='100'><tr><td class='covered' width='98'/>
591
+ <td class='uncovered' width='2'/>
592
592
  </tr>
593
593
  </table>
594
594
  </td>
@@ -599,190 +599,291 @@ span.run100 {
599
599
  </tbody>
600
600
  </table>
601
601
  <pre><span class="marked0"><a name="line1"></a> 1 module ClassX
602
- </span><span class="marked1"><a name="line2"></a> 2 class AttributeFactory
603
- </span><span class="marked0"><a name="line3"></a> 3 def self.create args
604
- </span><span class="marked1"><a name="line4"></a> 4 klass = Class.new
605
- </span><span class="marked0"><a name="line5"></a> 5 klass.class_eval do
606
- </span><span class="inferred1"><a name="line6"></a> 6
607
- </span><span class="inferred0"><a name="line7"></a> 7 # XXX: Hack for defining class method for klass
608
- </span><span class="marked1"><a name="line8"></a> 8 tmp_mod = Module.new
609
- </span><span class="marked0"><a name="line9"></a> 9 tmp_mod.module_eval do
610
- </span><span class="marked1"><a name="line10"></a> 10 define_method :config do
611
- </span><span class="marked0"><a name="line11"></a> 11 args
612
- </span><span class="inferred1"><a name="line12"></a> 12 end
613
- </span><span class="inferred0"><a name="line13"></a> 13
614
- </span><span class="marked1"><a name="line14"></a> 14 define_method :value_class do
615
- </span><span class="uncovered0"><a name="line15"></a> 15 args[:isa] || args[:kind_of]
616
- </span><span class="uncovered1"><a name="line16"></a> 16 end
602
+ </span><span class="marked1"><a name="line2"></a> 2 module AttributeMethods #:nodoc:
603
+ </span><span class="marked0"><a name="line3"></a> 3 module ClassMethods #:nodoc:
604
+ </span><span class="marked1"><a name="line4"></a> 4 def value_class
605
+ </span><span class="marked0"><a name="line5"></a> 5 config[:isa] || config[:kind_of]
606
+ </span><span class="marked1"><a name="line6"></a> 6 end
607
+ </span><span class="inferred0"><a name="line7"></a> 7
608
+ </span><span class="inferred1"><a name="line8"></a> 8 # description for attribute
609
+ </span><span class="marked0"><a name="line9"></a> 9 def desc
610
+ </span><span class="uncovered1"><a name="line10"></a> 10 config[:desc]
611
+ </span><span class="uncovered0"><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 # when this option specify true, not raise error in #initialize without value.
614
+ </span><span class="marked1"><a name="line14"></a> 14 def optional?
615
+ </span><span class="marked0"><a name="line15"></a> 15 return config[:optional]
616
+ </span><span class="marked1"><a name="line16"></a> 16 end
617
617
  </span><span class="inferred0"><a name="line17"></a> 17
618
- </span><span class="inferred1"><a name="line18"></a> 18 # description for attribute
619
- </span><span class="marked0"><a name="line19"></a> 19 define_method :desc do
620
- </span><span class="uncovered1"><a name="line20"></a> 20 args[:desc]
621
- </span><span class="uncovered0"><a name="line21"></a> 21 end
618
+ </span><span class="inferred1"><a name="line18"></a> 18 # when it lazy option specified, it will not be initialized when #initialize.
619
+ </span><span class="marked0"><a name="line19"></a> 19 def lazy?
620
+ </span><span class="marked1"><a name="line20"></a> 20 return config[:lazy]
621
+ </span><span class="marked0"><a name="line21"></a> 21 end
622
622
  </span><span class="inferred1"><a name="line22"></a> 22
623
- </span><span class="inferred0"><a name="line23"></a> 23 # you specify type changing rule with :coerce option.
624
- </span><span class="inferred1"><a name="line24"></a> 24 #
625
- </span><span class="marked0"><a name="line25"></a> 25 define_method :coerce do |val|
626
- </span><span class="marked1"><a name="line26"></a> 26 if args[:coerce]
627
- </span><span class="uncovered0"><a name="line27"></a> 27 case args[:coerce]
628
- </span><span class="uncovered1"><a name="line28"></a> 28 when Hash
629
- </span><span class="uncovered0"><a name="line29"></a> 29 result = val
630
- </span><span class="uncovered1"><a name="line30"></a> 30 args[:coerce].each do |cond, rule|
631
- </span><span class="uncovered0"><a name="line31"></a> 31 case cond
632
- </span><span class="uncovered1"><a name="line32"></a> 32 when Proc
633
- </span><span class="uncovered0"><a name="line33"></a> 33 if cond.call(val)
634
- </span><span class="uncovered1"><a name="line34"></a> 34 result = rule.call(val)
635
- </span><span class="uncovered0"><a name="line35"></a> 35 break
636
- </span><span class="uncovered1"><a name="line36"></a> 36 end
637
- </span><span class="uncovered0"><a name="line37"></a> 37 when Symbol
638
- </span><span class="uncovered1"><a name="line38"></a> 38 if val.respond_to? cond
639
- </span><span class="uncovered0"><a name="line39"></a> 39 result = rule.call(val)
640
- </span><span class="uncovered1"><a name="line40"></a> 40 break
641
- </span><span class="uncovered0"><a name="line41"></a> 41 end
642
- </span><span class="uncovered1"><a name="line42"></a> 42 when Module
643
- </span><span class="uncovered0"><a name="line43"></a> 43 if val.kind_of? cond
644
- </span><span class="uncovered1"><a name="line44"></a> 44 result = rule.call(val)
645
- </span><span class="uncovered0"><a name="line45"></a> 45 break
646
- </span><span class="uncovered1"><a name="line46"></a> 46 end
647
- </span><span class="uncovered0"><a name="line47"></a> 47 end
648
- </span><span class="uncovered1"><a name="line48"></a> 48 end
649
- </span><span class="uncovered0"><a name="line49"></a> 49
650
- </span><span class="uncovered1"><a name="line50"></a> 50 return result
651
- </span><span class="uncovered0"><a name="line51"></a> 51 when Array
652
- </span><span class="uncovered1"><a name="line52"></a> 52 result = val
653
- </span><span class="uncovered0"><a name="line53"></a> 53 args[:coerce].each do |item|
654
- </span><span class="uncovered1"><a name="line54"></a> 54 raise unless item.kind_of? Hash
655
- </span><span class="uncovered0"><a name="line55"></a> 55
656
- </span><span class="uncovered1"><a name="line56"></a> 56 case item
657
- </span><span class="uncovered0"><a name="line57"></a> 57 when Hash
658
- </span><span class="uncovered1"><a name="line58"></a> 58 item.each do |cond, rule|
659
- </span><span class="uncovered0"><a name="line59"></a> 59
660
- </span><span class="uncovered1"><a name="line60"></a> 60 case cond
661
- </span><span class="uncovered0"><a name="line61"></a> 61 when Proc
662
- </span><span class="uncovered1"><a name="line62"></a> 62 if cond.call(val)
663
- </span><span class="uncovered0"><a name="line63"></a> 63 result = rule.call(val)
664
- </span><span class="uncovered1"><a name="line64"></a> 64 break
665
- </span><span class="uncovered0"><a name="line65"></a> 65 end
666
- </span><span class="uncovered1"><a name="line66"></a> 66 end
667
- </span><span class="uncovered0"><a name="line67"></a> 67
668
- </span><span class="uncovered1"><a name="line68"></a> 68 break if result
669
- </span><span class="uncovered0"><a name="line69"></a> 69 end
670
- </span><span class="uncovered1"><a name="line70"></a> 70 end
671
- </span><span class="uncovered0"><a name="line71"></a> 71
672
- </span><span class="uncovered1"><a name="line72"></a> 72 break if result
673
- </span><span class="uncovered0"><a name="line73"></a> 73 end
674
- </span><span class="uncovered1"><a name="line74"></a> 74
675
- </span><span class="uncovered0"><a name="line75"></a> 75 return result
676
- </span><span class="uncovered1"><a name="line76"></a> 76 end
677
- </span><span class="inferred0"><a name="line77"></a> 77 else
678
- </span><span class="marked1"><a name="line78"></a> 78 return val
679
- </span><span class="inferred0"><a name="line79"></a> 79 end
680
- </span><span class="marked1"><a name="line80"></a> 80 end
681
- </span><span class="inferred0"><a name="line81"></a> 81
682
- </span><span class="inferred1"><a name="line82"></a> 82 # you can specify :validate option for checking when value is setted.
683
- </span><span class="inferred0"><a name="line83"></a> 83 # you can use :respond_to as shotcut for specifying { :validate =&gt; proc {|val| respond_to?(val, true) } }
684
- </span><span class="inferred1"><a name="line84"></a> 84 # you can use :isa or :kind_of as shotcut for specifying { :validate =&gt; proc {|val| kind_of?(val) } }
685
- </span><span class="marked0"><a name="line85"></a> 85 define_method :validate? do |val|
686
- </span><span class="marked1"><a name="line86"></a> 86 if args[:validate]
687
- </span><span class="uncovered0"><a name="line87"></a> 87 case args[:validate]
688
- </span><span class="uncovered1"><a name="line88"></a> 88 when Proc
689
- </span><span class="uncovered0"><a name="line89"></a> 89 return args[:validate].call(val)
690
- </span><span class="uncovered1"><a name="line90"></a> 90 when Regexp
691
- </span><span class="uncovered0"><a name="line91"></a> 91 return args[:validate] =~ val
692
- </span><span class="uncovered1"><a name="line92"></a> 92 else
693
- </span><span class="uncovered0"><a name="line93"></a> 93 return args[:validate] == val
694
- </span><span class="uncovered1"><a name="line94"></a> 94 end
695
- </span><span class="marked0"><a name="line95"></a> 95 elsif mod = ( args[:isa] || args[:kind_of] )
696
- </span><span class="marked1"><a name="line96"></a> 96 return val.kind_of?(mod)
697
- </span><span class="marked0"><a name="line97"></a> 97 elsif args[:respond_to]
698
- </span><span class="uncovered1"><a name="line98"></a> 98 return val.respond_to?(args[:respond_to], true)
699
- </span><span class="inferred0"><a name="line99"></a> 99 else
700
- </span><span class="inferred1"><a name="line100"></a>100 # nothing checked.
701
- </span><span class="marked0"><a name="line101"></a>101 true
702
- </span><span class="inferred1"><a name="line102"></a>102 end
703
- </span><span class="inferred0"><a name="line103"></a>103 end
704
- </span><span class="inferred1"><a name="line104"></a>104
705
- </span><span class="inferred0"><a name="line105"></a>105 # default paramater for attribute.
706
- </span><span class="inferred1"><a name="line106"></a>106 # if default is Proc, run Proc every time in instanciate.
707
- </span><span class="marked0"><a name="line107"></a>107 define_method :default do |parent|
708
- </span><span class="marked1"><a name="line108"></a>108 case args[:default]
709
- </span><span class="marked0"><a name="line109"></a>109 when Proc
710
- </span><span class="marked1"><a name="line110"></a>110 args[:default].call(parent)
711
- </span><span class="inferred0"><a name="line111"></a>111 else
712
- </span><span class="marked1"><a name="line112"></a>112 begin
713
- </span><span class="marked0"><a name="line113"></a>113 args[:default].dup
714
- </span><span class="inferred1"><a name="line114"></a>114 rescue Exception
715
- </span><span class="marked0"><a name="line115"></a>115 args[:default]
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 end
719
- </span><span class="inferred0"><a name="line119"></a>119
720
- </span><span class="inferred1"><a name="line120"></a>120 # when this option specify true, not raise error in #initialize without value.
721
- </span><span class="marked0"><a name="line121"></a>121 define_method :optional? do
722
- </span><span class="marked1"><a name="line122"></a>122 return args[:optional]
723
- </span><span class="inferred0"><a name="line123"></a>123 end
724
- </span><span class="inferred1"><a name="line124"></a>124
725
- </span><span class="inferred0"><a name="line125"></a>125 # when it lazy option specified, it will not be initialized when #initialize.
726
- </span><span class="marked1"><a name="line126"></a>126 define_method :lazy? do
727
- </span><span class="marked0"><a name="line127"></a>127 return args[:lazy]
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 define_method :inspect do
731
- </span><span class="uncovered0"><a name="line131"></a>131 &quot;ClassX::Attribute[#{self.config.inspect}]&quot;
732
- </span><span class="uncovered1"><a name="line132"></a>132 end
733
- </span><span class="uncovered0"><a name="line133"></a>133 end
734
- </span><span class="marked1"><a name="line134"></a>134 __send__ :extend, tmp_mod
735
- </span><span class="inferred0"><a name="line135"></a>135
736
- </span><span class="marked1"><a name="line136"></a>136 raise ClassX::RequiredAttrShouldNotHaveDefault if args[:optional] == false &amp;&amp; !args[:default].nil?
737
- </span><span class="marked0"><a name="line137"></a>137 raise ClassX::OptionalAttrShouldBeWritable if args[:optional] &amp;&amp; args[:writable] == false
738
- </span><span class="inferred1"><a name="line138"></a>138
739
- </span><span class="marked0"><a name="line139"></a>139 define_method :initialize do |val|
740
- </span><span class="marked1"><a name="line140"></a>140 @parent = val
741
- </span><span class="marked0"><a name="line141"></a>141 @data = nil
742
- </span><span class="inferred1"><a name="line142"></a>142 end
743
- </span><span class="inferred0"><a name="line143"></a>143
744
- </span><span class="marked1"><a name="line144"></a>144 define_method :get do
745
- </span><span class="marked0"><a name="line145"></a>145 @data ||= self.class.default(@parent)
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 define_method :set do |val|
749
- </span><span class="marked0"><a name="line149"></a>149 val = self.class.coerce(val)
750
- </span><span class="marked1"><a name="line150"></a>150 raise ClassX::InvalidAttrArgument unless self.class.validate? val
751
- </span><span class="marked0"><a name="line151"></a>151 @data = val
752
- </span><span class="inferred1"><a name="line152"></a>152 end
753
- </span><span class="inferred0"><a name="line153"></a>153
754
- </span><span class="inferred1"><a name="line154"></a>154 # for extending attribute point.
755
- </span><span class="marked0"><a name="line155"></a>155 if args[:include]
756
- </span><span class="uncovered1"><a name="line156"></a>156 case args[:include]
757
- </span><span class="uncovered0"><a name="line157"></a>157 when Array
758
- </span><span class="uncovered1"><a name="line158"></a>158 args[:include].each do |mod|
759
- </span><span class="uncovered0"><a name="line159"></a>159 self.__send__ :include, mod
760
- </span><span class="uncovered1"><a name="line160"></a>160 end
761
- </span><span class="uncovered0"><a name="line161"></a>161 else
762
- </span><span class="uncovered1"><a name="line162"></a>162 self.__send__ :include, args[:include]
763
- </span><span class="uncovered0"><a name="line163"></a>163 end
764
- </span><span class="uncovered1"><a name="line164"></a>164 end
765
- </span><span class="inferred0"><a name="line165"></a>165
766
- </span><span class="marked1"><a name="line166"></a>166 if args[:extend]
767
- </span><span class="uncovered0"><a name="line167"></a>167 case args[:extend]
768
- </span><span class="uncovered1"><a name="line168"></a>168 when Array
769
- </span><span class="uncovered0"><a name="line169"></a>169 args[:extend].each do |mod|
770
- </span><span class="uncovered1"><a name="line170"></a>170 self.__send__ :extend, mod
771
- </span><span class="uncovered0"><a name="line171"></a>171 end
772
- </span><span class="uncovered1"><a name="line172"></a>172 else
773
- </span><span class="uncovered0"><a name="line173"></a>173 self.__send__ :extend, args[:extend]
774
- </span><span class="uncovered1"><a name="line174"></a>174 end
775
- </span><span class="uncovered0"><a name="line175"></a>175 end
776
- </span><span class="inferred1"><a name="line176"></a>176
777
- </span><span class="marked0"><a name="line177"></a>177 define_method :inspect do
778
- </span><span class="uncovered1"><a name="line178"></a>178 &quot;&lt;#ClassX::Attribute:#{object_id} #{ @data.nil? ? '@data=nil' : '@data=' + @data.inspect } config=#{self.class.config.inspect}&gt;&quot;
779
- </span><span class="uncovered0"><a name="line179"></a>179 end
780
- </span><span class="uncovered1"><a name="line180"></a>180 end
623
+ </span><span class="marked0"><a name="line23"></a> 23 def inspect
624
+ </span><span class="uncovered1"><a name="line24"></a> 24 &quot;ClassX::Attribute[#{self.config.inspect}]&quot;
625
+ </span><span class="uncovered0"><a name="line25"></a> 25 end
626
+ </span><span class="inferred1"><a name="line26"></a> 26
627
+ </span><span class="marked0"><a name="line27"></a> 27 module CoerceWithHash #:nodoc:
628
+ </span><span class="marked1"><a name="line28"></a> 28 def coerce val
629
+ </span><span class="marked0"><a name="line29"></a> 29 result = val
630
+ </span><span class="marked1"><a name="line30"></a> 30 config[:coerce].each do |cond, rule|
631
+ </span><span class="marked0"><a name="line31"></a> 31 case cond
632
+ </span><span class="marked1"><a name="line32"></a> 32 when Proc
633
+ </span><span class="marked0"><a name="line33"></a> 33 if cond.call(val)
634
+ </span><span class="marked1"><a name="line34"></a> 34 result = rule.call(val)
635
+ </span><span class="marked0"><a name="line35"></a> 35 break
636
+ </span><span class="inferred1"><a name="line36"></a> 36 end
637
+ </span><span class="marked0"><a name="line37"></a> 37 when Symbol
638
+ </span><span class="marked1"><a name="line38"></a> 38 if val.respond_to? cond
639
+ </span><span class="marked0"><a name="line39"></a> 39 result = rule.call(val)
640
+ </span><span class="marked1"><a name="line40"></a> 40 break
641
+ </span><span class="inferred0"><a name="line41"></a> 41 end
642
+ </span><span class="marked1"><a name="line42"></a> 42 when Module
643
+ </span><span class="marked0"><a name="line43"></a> 43 if val.kind_of? cond
644
+ </span><span class="marked1"><a name="line44"></a> 44 result = rule.call(val)
645
+ </span><span class="marked0"><a name="line45"></a> 45 break
646
+ </span><span class="inferred1"><a name="line46"></a> 46 end
647
+ </span><span class="inferred0"><a name="line47"></a> 47 end
648
+ </span><span class="inferred1"><a name="line48"></a> 48 end
649
+ </span><span class="inferred0"><a name="line49"></a> 49
650
+ </span><span class="marked1"><a name="line50"></a> 50 return result
651
+ </span><span class="inferred0"><a name="line51"></a> 51 end
652
+ </span><span class="inferred1"><a name="line52"></a> 52 end
653
+ </span><span class="marked0"><a name="line53"></a> 53 module CoerceWithArray #:nodoc:
654
+ </span><span class="marked1"><a name="line54"></a> 54 def coerce val
655
+ </span><span class="marked0"><a name="line55"></a> 55 result = val
656
+ </span><span class="marked1"><a name="line56"></a> 56 config[:coerce].each do |item|
657
+ </span><span class="marked0"><a name="line57"></a> 57 raise unless item.kind_of? Hash
658
+ </span><span class="inferred1"><a name="line58"></a> 58
659
+ </span><span class="marked0"><a name="line59"></a> 59 case item
660
+ </span><span class="marked1"><a name="line60"></a> 60 when Hash
661
+ </span><span class="marked0"><a name="line61"></a> 61 item.each do |cond, rule|
662
+ </span><span class="marked1"><a name="line62"></a> 62 case cond
663
+ </span><span class="marked0"><a name="line63"></a> 63 when Proc
664
+ </span><span class="marked1"><a name="line64"></a> 64 if cond.call(val)
665
+ </span><span class="marked0"><a name="line65"></a> 65 result = rule.call(val)
666
+ </span><span class="marked1"><a name="line66"></a> 66 break
667
+ </span><span class="inferred0"><a name="line67"></a> 67 end
668
+ </span><span class="inferred1"><a name="line68"></a> 68 end
669
+ </span><span class="inferred0"><a name="line69"></a> 69
670
+ </span><span class="marked1"><a name="line70"></a> 70 break if result
671
+ </span><span class="inferred0"><a name="line71"></a> 71 end
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 break if result
675
+ </span><span class="inferred0"><a name="line75"></a> 75 end
676
+ </span><span class="inferred1"><a name="line76"></a> 76
677
+ </span><span class="marked0"><a name="line77"></a> 77 return result
678
+ </span><span class="inferred1"><a name="line78"></a> 78 end
679
+ </span><span class="inferred0"><a name="line79"></a> 79 end
680
+ </span><span class="inferred1"><a name="line80"></a> 80
681
+ </span><span class="marked0"><a name="line81"></a> 81 module CoerceNothing #:nodoc:
682
+ </span><span class="marked1"><a name="line82"></a> 82 def coerce val
683
+ </span><span class="marked0"><a name="line83"></a> 83 val
684
+ </span><span class="marked1"><a name="line84"></a> 84 end
685
+ </span><span class="inferred0"><a name="line85"></a> 85 end
686
+ </span><span class="inferred1"><a name="line86"></a> 86
687
+ </span><span class="marked0"><a name="line87"></a> 87 module DefaultWithProc #:nodoc:
688
+ </span><span class="marked1"><a name="line88"></a> 88 def default parent
689
+ </span><span class="marked0"><a name="line89"></a> 89 config[:default].call(parent)
690
+ </span><span class="marked1"><a name="line90"></a> 90 end
691
+ </span><span class="inferred0"><a name="line91"></a> 91 end
692
+ </span><span class="marked1"><a name="line92"></a> 92 module DefaultWithNoProc #:nodoc:
693
+ </span><span class="marked0"><a name="line93"></a> 93 def default parent
694
+ </span><span class="marked1"><a name="line94"></a> 94 begin
695
+ </span><span class="marked0"><a name="line95"></a> 95 config[:default].dup
696
+ </span><span class="inferred1"><a name="line96"></a> 96 rescue Exception
697
+ </span><span class="marked0"><a name="line97"></a> 97 config[:default]
698
+ </span><span class="inferred1"><a name="line98"></a> 98 end
699
+ </span><span class="marked0"><a name="line99"></a> 99 end
700
+ </span><span class="inferred1"><a name="line100"></a>100 end
701
+ </span><span class="inferred0"><a name="line101"></a>101
702
+ </span><span class="marked1"><a name="line102"></a>102 module ValidateWithProc #:nodoc:
703
+ </span><span class="marked0"><a name="line103"></a>103 def validate? val
704
+ </span><span class="marked1"><a name="line104"></a>104 return config[:validate].call(val)
705
+ </span><span class="marked0"><a name="line105"></a>105 end
706
+ </span><span class="inferred1"><a name="line106"></a>106 end
707
+ </span><span class="inferred0"><a name="line107"></a>107
708
+ </span><span class="marked1"><a name="line108"></a>108 module ValidateWithNotProc #:nodoc:
709
+ </span><span class="marked0"><a name="line109"></a>109 def validate? val
710
+ </span><span class="marked1"><a name="line110"></a>110 return config[:validate] === val
711
+ </span><span class="marked0"><a name="line111"></a>111 end
712
+ </span><span class="inferred1"><a name="line112"></a>112 end
713
+ </span><span class="inferred0"><a name="line113"></a>113
714
+ </span><span class="marked1"><a name="line114"></a>114 module ValidateEach #:nodoc:
715
+ </span><span class="marked0"><a name="line115"></a>115 def validate? val
716
+ </span><span class="marked1"><a name="line116"></a>116 return false unless val.respond_to? :all?
717
+ </span><span class="inferred0"><a name="line117"></a>117
718
+ </span><span class="marked1"><a name="line118"></a>118 if self.value_class
719
+ </span><span class="marked0"><a name="line119"></a>119 return false unless val.kind_of?(self.value_class)
720
+ </span><span class="inferred1"><a name="line120"></a>120
721
+ </span><span class="marked0"><a name="line121"></a>121 case val
722
+ </span><span class="marked1"><a name="line122"></a>122 when Hash
723
+ </span><span class="marked0"><a name="line123"></a>123 if config[:validate_each].arity == 2
724
+ </span><span class="marked1"><a name="line124"></a>124 val.all? {|item| config[:validate_each].call(*item) }
725
+ </span><span class="inferred0"><a name="line125"></a>125 else
726
+ </span><span class="marked1"><a name="line126"></a>126 ClassX::Validate.validate(val, &amp;config[:validate_each])
727
+ </span><span class="inferred0"><a name="line127"></a>127 end
728
+ </span><span class="inferred1"><a name="line128"></a>128 else
729
+ </span><span class="marked0"><a name="line129"></a>129 val.all? {|item| config[:validate_each].call(*item) }
730
+ </span><span class="inferred1"><a name="line130"></a>130 end
731
+ </span><span class="inferred0"><a name="line131"></a>131 else
732
+ </span><span class="marked1"><a name="line132"></a>132 val.all? {|item| config[:validate_each].call(*item) }
733
+ </span><span class="inferred0"><a name="line133"></a>133 end
734
+ </span><span class="inferred1"><a name="line134"></a>134 end
735
+ </span><span class="inferred0"><a name="line135"></a>135 end
736
+ </span><span class="inferred1"><a name="line136"></a>136
737
+ </span><span class="marked0"><a name="line137"></a>137 module ValidateKindOf #:nodoc:
738
+ </span><span class="marked1"><a name="line138"></a>138 def validate? val
739
+ </span><span class="marked0"><a name="line139"></a>139 return val.kind_of?(self.value_class)
740
+ </span><span class="marked1"><a name="line140"></a>140 end
741
+ </span><span class="inferred0"><a name="line141"></a>141 end
742
+ </span><span class="inferred1"><a name="line142"></a>142
743
+ </span><span class="marked0"><a name="line143"></a>143 module ValidateRespondTo #:nodoc:
744
+ </span><span class="marked1"><a name="line144"></a>144 def validate? val
745
+ </span><span class="marked0"><a name="line145"></a>145 return val.respond_to?(config[:respond_to])
746
+ </span><span class="marked1"><a name="line146"></a>146 end
747
+ </span><span class="inferred0"><a name="line147"></a>147 end
748
+ </span><span class="inferred1"><a name="line148"></a>148
749
+ </span><span class="marked0"><a name="line149"></a>149 module ValidateNothing #:nodoc:
750
+ </span><span class="marked1"><a name="line150"></a>150 def validate? val
751
+ </span><span class="inferred0"><a name="line151"></a>151 # nothing checked.
752
+ </span><span class="marked1"><a name="line152"></a>152 true
753
+ </span><span class="marked0"><a name="line153"></a>153 end
754
+ </span><span class="inferred1"><a name="line154"></a>154 end
755
+ </span><span class="inferred0"><a name="line155"></a>155 end
756
+ </span><span class="inferred1"><a name="line156"></a>156
757
+ </span><span class="marked0"><a name="line157"></a>157 module InstanceMethods #:nodoc:
758
+ </span><span class="marked1"><a name="line158"></a>158 def initialize val
759
+ </span><span class="marked0"><a name="line159"></a>159 @parent = val
760
+ </span><span class="marked1"><a name="line160"></a>160 @data = nil
761
+ </span><span class="inferred0"><a name="line161"></a>161 end
762
+ </span><span class="inferred1"><a name="line162"></a>162
763
+ </span><span class="marked0"><a name="line163"></a>163 def get
764
+ </span><span class="marked1"><a name="line164"></a>164 @data ||= self.class.default(@parent)
765
+ </span><span class="marked0"><a name="line165"></a>165 end
766
+ </span><span class="inferred1"><a name="line166"></a>166
767
+ </span><span class="inferred0"><a name="line167"></a>167 # XXX:
768
+ </span><span class="inferred1"><a name="line168"></a>168 # you should not call this method except for @parent instance's setter method.
769
+ </span><span class="inferred0"><a name="line169"></a>169 # It's because caching as instance_variable in @parent instance for performance.
770
+ </span><span class="marked1"><a name="line170"></a>170 def set val
771
+ </span><span class="marked0"><a name="line171"></a>171 val = self.class.coerce(val)
772
+ </span><span class="marked1"><a name="line172"></a>172 raise ClassX::InvalidAttrArgument unless self.class.validate? val
773
+ </span><span class="marked0"><a name="line173"></a>173 @data = val
774
+ </span><span class="inferred1"><a name="line174"></a>174 end
775
+ </span><span class="inferred0"><a name="line175"></a>175
776
+ </span><span class="marked1"><a name="line176"></a>176 def inspect
777
+ </span><span class="marked0"><a name="line177"></a>177 &quot;&lt;#ClassX::Attribute:#{object_id} #{ @data.nil? ? '@data=nil' : '@data=' + @data.inspect } @parent=#{@parent} config=#{self.class.config.inspect}&gt;&quot;
778
+ </span><span class="marked1"><a name="line178"></a>178 end
779
+ </span><span class="inferred0"><a name="line179"></a>179 end
780
+ </span><span class="inferred1"><a name="line180"></a>180 end
781
781
  </span><span class="inferred0"><a name="line181"></a>181
782
- </span><span class="marked1"><a name="line182"></a>182 klass
783
- </span><span class="inferred0"><a name="line183"></a>183 end
784
- </span><span class="inferred1"><a name="line184"></a>184 end
785
- </span><span class="inferred0"><a name="line185"></a>185 end
782
+ </span><span class="inferred1"><a name="line182"></a>182 #
783
+ </span><span class="inferred0"><a name="line183"></a>183 # generating anonymous class for meta attribute class.
784
+ </span><span class="inferred1"><a name="line184"></a>184 #
785
+ </span><span class="marked0"><a name="line185"></a>185 class AttributeFactory
786
+ </span><span class="inferred1"><a name="line186"></a>186 #
787
+ </span><span class="inferred0"><a name="line187"></a>187 # creating anonymous class for meta attribute class.
788
+ </span><span class="marked1"><a name="line188"></a>188 def self.create args
789
+ </span><span class="inferred0"><a name="line189"></a>189 # TODO: hmm, ClassX::Commandable do nothing when freezed.
790
+ </span><span class="inferred1"><a name="line190"></a>190 #
791
+ </span><span class="inferred0"><a name="line191"></a>191 # if you would like to change attribute's infomation, it's better to redefine attribute.
792
+ </span><span class="inferred1"><a name="line192"></a>192 # So, config should freezed.
793
+ </span><span class="inferred0"><a name="line193"></a>193 # args.each do |key, val|
794
+ </span><span class="inferred1"><a name="line194"></a>194 # key.freeze
795
+ </span><span class="inferred0"><a name="line195"></a>195 # val.freeze
796
+ </span><span class="inferred1"><a name="line196"></a>196 # end
797
+ </span><span class="inferred0"><a name="line197"></a>197 # args.freeze
798
+ </span><span class="inferred1"><a name="line198"></a>198
799
+ </span><span class="marked0"><a name="line199"></a>199 raise ClassX::RequiredAttrShouldNotHaveDefault if args[:optional] == false &amp;&amp; !args[:default].nil?
800
+ </span><span class="marked1"><a name="line200"></a>200 raise ClassX::OptionalAttrShouldBeWritable if args[:optional] &amp;&amp; args[:writable] == false
801
+ </span><span class="inferred0"><a name="line201"></a>201
802
+ </span><span class="marked1"><a name="line202"></a>202 klass = Class.new
803
+ </span><span class="inferred0"><a name="line203"></a>203
804
+ </span><span class="marked1"><a name="line204"></a>204 klass.extend(ClassX::AttributeMethods::ClassMethods)
805
+ </span><span class="inferred0"><a name="line205"></a>205
806
+ </span><span class="inferred1"><a name="line206"></a>206 # you specify type changing rule with :coerce option.
807
+ </span><span class="marked0"><a name="line207"></a>207 if args[:coerce]
808
+ </span><span class="marked1"><a name="line208"></a>208 case args[:coerce]
809
+ </span><span class="marked0"><a name="line209"></a>209 when Hash
810
+ </span><span class="marked1"><a name="line210"></a>210 klass.extend(ClassX::AttributeMethods::ClassMethods::CoerceWithHash)
811
+ </span><span class="marked0"><a name="line211"></a>211 when Array
812
+ </span><span class="marked1"><a name="line212"></a>212 klass.extend(ClassX::AttributeMethods::ClassMethods::CoerceWithArray)
813
+ </span><span class="inferred0"><a name="line213"></a>213 end
814
+ </span><span class="inferred1"><a name="line214"></a>214 else
815
+ </span><span class="marked0"><a name="line215"></a>215 klass.extend(ClassX::AttributeMethods::ClassMethods::CoerceNothing)
816
+ </span><span class="inferred1"><a name="line216"></a>216 end
817
+ </span><span class="inferred0"><a name="line217"></a>217
818
+ </span><span class="inferred1"><a name="line218"></a>218 # default paramater for attribute.
819
+ </span><span class="inferred0"><a name="line219"></a>219 # if default is Proc, run Proc every time in instanciate.
820
+ </span><span class="marked1"><a name="line220"></a>220 case args[:default]
821
+ </span><span class="marked0"><a name="line221"></a>221 when Proc
822
+ </span><span class="marked1"><a name="line222"></a>222 klass.extend(ClassX::AttributeMethods::ClassMethods::DefaultWithProc)
823
+ </span><span class="inferred0"><a name="line223"></a>223 else
824
+ </span><span class="marked1"><a name="line224"></a>224 klass.extend(ClassX::AttributeMethods::ClassMethods::DefaultWithNoProc)
825
+ </span><span class="inferred0"><a name="line225"></a>225 end
826
+ </span><span class="inferred1"><a name="line226"></a>226
827
+ </span><span class="inferred0"><a name="line227"></a>227 # you can specify :validate option for checking when value is setted.
828
+ </span><span class="inferred1"><a name="line228"></a>228 # you can use :respond_to as shotcut for specifying { :validate =&gt; proc {|val| respond_to?(val, true) } }
829
+ </span><span class="inferred0"><a name="line229"></a>229 # you can use :isa or :kind_of as shotcut for specifying { :validate =&gt; proc {|val| kind_of?(val) } }
830
+ </span><span class="marked1"><a name="line230"></a>230 if args[:validate]
831
+ </span><span class="marked0"><a name="line231"></a>231 case args[:validate]
832
+ </span><span class="marked1"><a name="line232"></a>232 when Proc
833
+ </span><span class="marked0"><a name="line233"></a>233 klass.extend(ClassX::AttributeMethods::ClassMethods::ValidateWithProc)
834
+ </span><span class="inferred1"><a name="line234"></a>234 else
835
+ </span><span class="marked0"><a name="line235"></a>235 klass.extend(ClassX::AttributeMethods::ClassMethods::ValidateWithNotProc)
836
+ </span><span class="inferred1"><a name="line236"></a>236 end
837
+ </span><span class="marked0"><a name="line237"></a>237 elsif args[:validate_each]
838
+ </span><span class="marked1"><a name="line238"></a>238 klass.extend(ClassX::AttributeMethods::ClassMethods::ValidateEach)
839
+ </span><span class="marked0"><a name="line239"></a>239 elsif mod = ( args[:isa] || args[:kind_of] )
840
+ </span><span class="marked1"><a name="line240"></a>240 klass.extend(ClassX::AttributeMethods::ClassMethods::ValidateKindOf)
841
+ </span><span class="marked0"><a name="line241"></a>241 elsif args[:respond_to]
842
+ </span><span class="marked1"><a name="line242"></a>242 klass.extend(ClassX::AttributeMethods::ClassMethods::ValidateRespondTo)
843
+ </span><span class="inferred0"><a name="line243"></a>243 else
844
+ </span><span class="marked1"><a name="line244"></a>244 klass.extend(ClassX::AttributeMethods::ClassMethods::ValidateNothing)
845
+ </span><span class="inferred0"><a name="line245"></a>245 end
846
+ </span><span class="inferred1"><a name="line246"></a>246
847
+ </span><span class="inferred0"><a name="line247"></a>247 # for extending attribute point.
848
+ </span><span class="marked1"><a name="line248"></a>248 if args[:include]
849
+ </span><span class="marked0"><a name="line249"></a>249 case args[:include]
850
+ </span><span class="marked1"><a name="line250"></a>250 when Array
851
+ </span><span class="marked0"><a name="line251"></a>251 args[:include].each do |mod|
852
+ </span><span class="marked1"><a name="line252"></a>252 klass.__send__ :include, mod
853
+ </span><span class="inferred0"><a name="line253"></a>253 end
854
+ </span><span class="inferred1"><a name="line254"></a>254 else
855
+ </span><span class="marked0"><a name="line255"></a>255 klass.__send__ :include, args[:include]
856
+ </span><span class="inferred1"><a name="line256"></a>256 end
857
+ </span><span class="inferred0"><a name="line257"></a>257 end
858
+ </span><span class="inferred1"><a name="line258"></a>258
859
+ </span><span class="marked0"><a name="line259"></a>259 if args[:extend]
860
+ </span><span class="marked1"><a name="line260"></a>260 case args[:extend]
861
+ </span><span class="marked0"><a name="line261"></a>261 when Array
862
+ </span><span class="marked1"><a name="line262"></a>262 args[:extend].each do |mod|
863
+ </span><span class="marked0"><a name="line263"></a>263 klass.__send__ :extend, mod
864
+ </span><span class="inferred1"><a name="line264"></a>264 end
865
+ </span><span class="inferred0"><a name="line265"></a>265 else
866
+ </span><span class="marked1"><a name="line266"></a>266 klass.__send__ :extend, args[:extend]
867
+ </span><span class="inferred0"><a name="line267"></a>267 end
868
+ </span><span class="inferred1"><a name="line268"></a>268 end
869
+ </span><span class="inferred0"><a name="line269"></a>269
870
+ </span><span class="inferred1"><a name="line270"></a>270 # XXX: Hack for defining class method for klass
871
+ </span><span class="marked0"><a name="line271"></a>271 tmp_mod = Module.new
872
+ </span><span class="marked1"><a name="line272"></a>272 tmp_mod.module_eval do
873
+ </span><span class="marked0"><a name="line273"></a>273 define_method :config do
874
+ </span><span class="marked1"><a name="line274"></a>274 args
875
+ </span><span class="inferred0"><a name="line275"></a>275 end
876
+ </span><span class="inferred1"><a name="line276"></a>276 end
877
+ </span><span class="marked0"><a name="line277"></a>277 klass.extend(tmp_mod)
878
+ </span><span class="inferred1"><a name="line278"></a>278
879
+ </span><span class="marked0"><a name="line279"></a>279 klass.class_eval do
880
+ </span><span class="marked1"><a name="line280"></a>280 include ClassX::AttributeMethods::InstanceMethods
881
+ </span><span class="inferred0"><a name="line281"></a>281 end
882
+ </span><span class="inferred1"><a name="line282"></a>282
883
+ </span><span class="marked0"><a name="line283"></a>283 klass
884
+ </span><span class="inferred1"><a name="line284"></a>284 end
885
+ </span><span class="inferred0"><a name="line285"></a>285 end
886
+ </span><span class="inferred1"><a name="line286"></a>286 end
786
887
  </span></pre><hr/>
787
888
  <p>Generated using the <a href='http://eigenclass.org/hiki.rb?rcov'>rcov code coverage analysis tool for Ruby</a>
788
889
  version 0.8.1.2.</p>