[NEW] Gestalts for silverlight + popular JS libs
[ohcount] / ruby / gestalt / rules / rule.rb
1 module Ohcount
2         module Gestalt
3                 class Rule
4                         def ==(other)
5                                 return false unless self.class == other.class
6                                 return false unless self.instance_variables == other.instance_variables
7                                 self.instance_variables.each do |v|
8                                         return false unless self.instance_eval(v) == other.instance_eval(v)
9                                 end
10                                 true
11                         end
12
13       def each_rule
14         yield self
15       end
16
17                         def to_sym
18                                 self.class.to_sym
19                         end
20
21                         # when tallying up libraries, its easier to
22                         # use symbol names instead of class names
23                         # to_sym maps FooLib to :foo_lib
24                         def self.to_sym
25                                 @symbol ||= begin
26                                                                                         to_s =~ /([^:]*)$/
27                                                                                         naked_classname = $1
28                                                                                         chars = naked_classname.scan(/./)
29                                                                                         chars[0] = chars[0].downcase
30                                                                                         ruby_s = chars.collect do |char|
31                                                                                                 char.downcase == char ? char : "_" + char.downcase
32                                                                                         end.to_s
33                                                                                         ruby_s.intern
34                                                                                 end
35                         end
36
37                         def self.method_missing(m,*args)
38                                 if /(.*)_keywords$/ =~ m.to_s
39                                         language = $1
40                                         return rules << KeywordRule.new(language,*args)
41                                 end
42                                 super
43                         end
44
45                 end
46         end
47 end