1require "rss/1.0"
2
3module RSS
4
5  SY_PREFIX = 'sy'
6  SY_URI = "http://purl.org/rss/1.0/modules/syndication/"
7
8  RDF.install_ns(SY_PREFIX, SY_URI)
9
10  module SyndicationModel
11
12    extend BaseModel
13
14    ELEMENTS = []
15
16    def self.append_features(klass)
17      super
18
19      klass.install_must_call_validator(SY_PREFIX, SY_URI)
20      klass.module_eval do
21        [
22          ["updatePeriod"],
23          ["updateFrequency", :positive_integer]
24        ].each do |name, type|
25          install_text_element(name, SY_URI, "?",
26                               "#{SY_PREFIX}_#{name}", type,
27                               "#{SY_PREFIX}:#{name}")
28        end
29
30        %w(updateBase).each do |name|
31          install_date_element(name, SY_URI, "?",
32                               "#{SY_PREFIX}_#{name}", 'w3cdtf',
33                               "#{SY_PREFIX}:#{name}")
34        end
35      end
36
37      klass.module_eval(<<-EOC, __FILE__, __LINE__ + 1)
38        alias_method(:_sy_updatePeriod=, :sy_updatePeriod=)
39        def sy_updatePeriod=(new_value)
40          new_value = new_value.strip
41          validate_sy_updatePeriod(new_value) if @do_validate
42          self._sy_updatePeriod = new_value
43        end
44      EOC
45    end
46
47    private
48    SY_UPDATEPERIOD_AVAILABLE_VALUES = %w(hourly daily weekly monthly yearly)
49    def validate_sy_updatePeriod(value)
50      unless SY_UPDATEPERIOD_AVAILABLE_VALUES.include?(value)
51        raise NotAvailableValueError.new("updatePeriod", value)
52      end
53    end
54  end
55
56  class RDF
57    class Channel; include SyndicationModel; end
58  end
59
60  prefix_size = SY_PREFIX.size + 1
61  SyndicationModel::ELEMENTS.uniq!
62  SyndicationModel::ELEMENTS.each do |full_name|
63    name = full_name[prefix_size..-1]
64    BaseListener.install_get_text_element(SY_URI, name, full_name)
65  end
66
67end
68