aboutsummaryrefslogtreecommitdiffstats
path: root/core/plugin/spell/struct.rb
blob: 039a8c01a2d5bdbd8697474b46abf94a7d536662 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# -*- coding: utf-8 -*-

module Plugin::Spell

  Spell = Struct.new(:name, :constraint, :condition, :proc) do
    def match(models, optional)
      Set.new(constraint.map{|a| Diva::Model(a) }) == Set.new(models.map{|a| a.class }) and condition?(models)
    end

    def call(models, optional)
      order = constraint.map{|a| Diva::Model(a) }
      proc.call(*models.sort_by{|m| order.index(m.class) }, optional)
    end

    def condition?(models, optional)
      if condition
        order = constraint.map{|a| Diva::Model(a) }
        condition.call(*models.sort_by{|m| order.index(m.class) }, optional)
      else
        true
      end
    end
  end
end