OTWO-1213 Works around lost encoding in Ruby/C binding layer
[ohcount] / ruby / gestalt / definition.rb
1 require 'gestalt/rules/rule'
2 require 'gestalt/rules/logical_rule'
3 require 'gestalt/rules/or_rule'
4 require 'gestalt/rules/and_rule'
5 require 'gestalt/rules/not_rule'
6 require 'gestalt/rules/language_rule'
7 require 'gestalt/rules/file_rule'
8 require 'gestalt/rules/filename_rule'
9 require 'gestalt/rules/find_filenames_rule'
10 require 'gestalt/rules/c_header_rule'
11 require 'gestalt/rules/keyword_rule'
12 require 'gestalt/rules/c_keyword_rule'
13 require 'gestalt/rules/gestalt_rule'
14 require 'gestalt/rules/java_import_rule'
15 require 'gestalt/rules/csharp_using_rule'
16 require 'gestalt/rules/maven_parser'
17 require 'gestalt/rules/maven_rule'
18 require 'gestalt/rules/csproj_parser'
19 require 'gestalt/rules/csproj_rule'
20
21 module Ohcount
22   module Gestalt
23
24     class Definition
25       attr_reader :type, :fixed_name
26
27       def initialize(type, fixed_name = nil, options = {}, &block)
28         @type = type
29         @fixed_name = fixed_name
30         if options[:rule]
31           @top_level_or = options[:rule]
32         else
33           @top_level_or = OrRule.new(&block)
34         end
35       end
36
37       def gestalts(gestalt_engine)
38         @top_level_or.triggers(gestalt_engine).map do |trigger|
39           Gestalt::Base.new(type, trigger.name || self.fixed_name, trigger.count)
40         end
41       end
42
43       def top_level_or
44         @top_level_or ||= OrRule.new
45       end
46
47       def self.add_definition(definition)
48         @definitions ||= []
49         @definitions << definition
50       end
51
52       def self.all_definitions
53         @definitions || []
54       end
55
56       def clone
57         rule = top_level_or.clone
58         Definition.new(type,fixed_name,:rule => rule)
59       end
60     end
61
62
63     # DSL language to allow people to define gestalt definitions like this:\
64     #
65     # define_xxx 'Foobar' do
66     #   filenames 'foobar'
67     # end
68     #
69     def self.method_missing(method, *args, &block)
70       if method.to_s =~ /define_(.*)$/
71         Definition.add_definition(Definition.new($1.intern,*args,&block))
72       else
73         super
74       end
75     end
76   end
77 end