<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>lib/recurrence/shortcuts.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -4,8 +4,14 @@ require 'activesupport'
 
 dirname = File.dirname(__FILE__)
 require dirname + '/recurrence/base'
+require dirname + '/recurrence/shortcuts'
 require dirname + '/recurrence/event'
 require dirname + '/recurrence/event/daily'
 require dirname + '/recurrence/event/weekly'
 require dirname + '/recurrence/event/monthly'
 require dirname + '/recurrence/event/yearly'
+
+class Recurrence
+  include Base
+  extend Shortcuts
+end</diff>
      <filename>lib/recurrence.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,142 +1,127 @@
 class Recurrence
-  FREQUENCY = %w(day week month year)
-
-  attr_reader :event
-
-  def initialize(options)
-    raise ArgumentError, ':every option is required' unless options.key?(:every)
-    raise ArgumentError, 'invalid :every option'     unless FREQUENCY.include?(options[:every].to_s)
-
-    @options = initialize_dates(options)
-    @options[:interval] ||= 1
-
-    @event = case @options[:every].to_sym
-      when :day
-        Recurrence::Event::Daily.new(@options)
-      when :week
-        @event = Recurrence::Event::Weekly.new(@options)
-      when :month
-        @event = Recurrence::Event::Monthly.new(@options)
-      when :year
-        @event = Recurrence::Event::Yearly.new(@options)
+  module Base
+    FREQUENCY = %w(day week month year)
+
+    attr_reader :event
+
+    def self.included(base) #:nodoc:
+      base.extend ClassMethods
     end
-  end
 
-  def reset!
-    @event.reset!
-    @events = nil
-  end
+    # Holds default_until_date configuration.
+    #
+    module ClassMethods #:nodoc:
+      def default_until_date
+        @default_until_date ||= Date.new(2037, 12, 31)
+      end
 
-  def include?(required_date)
-    required_date = Date.parse(required_date) if required_date.is_a?(String)
+      def default_until_date=(date)
+        @default_until_date = if date.is_a?(String)
+          Date.parse(date)
+        else
+          date
+        end
+      end
+    end
 
-    if required_date &lt; @options[:starts] || required_date &gt; @options[:until]
-      false
-    else
-      each do |date|
-        return true if date == required_date
+    def initialize(options)
+      raise ArgumentError, ':every option is required' unless options.key?(:every)
+      raise ArgumentError, 'invalid :every option'     unless FREQUENCY.include?(options[:every].to_s)
+
+      @options = initialize_dates(options)
+      @options[:interval] ||= 1
+
+      @event = case @options[:every].to_sym
+        when :day
+          Recurrence::Event::Daily.new(@options)
+        when :week
+          Recurrence::Event::Weekly.new(@options)
+        when :month
+          Recurrence::Event::Monthly.new(@options)
+        when :year
+          Recurrence::Event::Yearly.new(@options)
       end
     end
 
-    return false
-  end
+    def reset!
+      @event.reset!
+      @events = nil
+    end
 
-  def next
-    @event.next
-  end
+    def include?(required_date)
+      required_date = Date.parse(required_date) if required_date.is_a?(String)
 
-  def next!
-    @event.next!
-  end
+      if required_date &lt; @options[:starts] || required_date &gt; @options[:until]
+        false
+      else
+        each do |date|
+          return true if date == required_date
+        end
+      end
 
-  def events(options={})
-    options[:starts] = Date.parse(options[:starts]) if options[:starts].is_a?(String)
-    options[:until]  = Date.parse(options[:until])  if options[:until].is_a?(String)
+      return false
+    end
 
-    reset! if options[:starts] || options[:until]
+    def next
+      @event.next
+    end
 
-    @events ||= begin
-      _events = []
+    def next!
+      @event.next!
+    end
 
-      loop do
-        date = @event.next!
+    def events(options={})
+      options[:starts] = Date.parse(options[:starts]) if options[:starts].is_a?(String)
+      options[:until]  = Date.parse(options[:until])  if options[:until].is_a?(String)
 
-        break if date.nil?
+      reset! if options[:starts] || options[:until]
 
-        valid_start = options[:starts].nil? || date &gt;= options[:starts]
-        valid_until = options[:until].nil?  || date &lt;= options[:until]
-        _events &lt;&lt; date if valid_start &amp;&amp; valid_until
+      @events ||= begin
+        _events = []
 
-        break if options[:until] &amp;&amp; options[:until] &lt;= date
-      end
+        loop do
+          date = @event.next!
 
-      _events
-    end
-  end
+          break if date.nil?
 
-  def events!(options={})
-    reset!
-    events(options)
-  end
+          valid_start = options[:starts].nil? || date &gt;= options[:starts]
+          valid_until = options[:until].nil?  || date &lt;= options[:until]
+          _events &lt;&lt; date if valid_start &amp;&amp; valid_until
 
-  def each!(&amp;block)
-    reset!
-    each(&amp;block)
-  end
+          break if options[:until] &amp;&amp; options[:until] &lt;= date
+        end
 
-  def each(&amp;block)
-    events.each do |item|
-      yield item
+        _events
+      end
     end
-  end
 
-  # Defaul until date configuration.
-  #
-  def self.default_until_date=(date)
-    @default_until_date = if date.is_a?(String)
-      Date.parse(date)
-    else
-      date
+    def events!(options={})
+      reset!
+      events(options)
     end
-  end
 
-  def self.default_until_date
-    @default_until_date ||= Date.new(2037, 12, 31)
-  end
-
-  # Recurrence.type shortcuts
-  #
-  def self.daily(options={})
-    options[:every] = :day
-    new(options)
-  end
+    def each!(&amp;block)
+      reset!
+      each(&amp;block)
+    end
 
-  def self.weekly(options)
-    options[:every] = :week
-    new(options)
-  end
+    def each(&amp;block)
+      events.each do |item|
+        yield item
+      end
+    end
 
-  def self.monthly(options)
-    options[:every] = :month
-    new(options)
-  end
+    private
 
-  def self.yearly(options)
-    options[:every] = :year
-    new(options)
-  end
+      def initialize_dates(options) #:nodoc:
+        [:starts, :until].each do |name|
+          options[name] = Date.parse(options[name]) if options[name].is_a?(String)
+        end
 
-  private
+        options[:starts] ||= Date.today
+        options[:until]  ||= self.class.default_until_date
 
-    def initialize_dates(options) #:nodoc:
-      [:starts, :until].each do |name|
-        options[name] = Date.parse(options[name]) if options[name].is_a?(String)
+        options
       end
-
-      options[:starts] ||= Date.today
-      options[:until]  ||= self.class.default_until_date
-
-      options
-    end
-
+  end
 end</diff>
      <filename>lib/recurrence/base.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>de7733811897c66948b8371e1b40d120fcb0522e</id>
    </parent>
  </parents>
  <author>
    <name>Jos&#233; Valim</name>
    <email>jose.valim@gmail.com</email>
  </author>
  <url>http://github.com/fnando/recurrence/commit/70099cfac1053c7fb00e942d465c21e8899e6fba</url>
  <id>70099cfac1053c7fb00e942d465c21e8899e6fba</id>
  <committed-date>2009-07-18T11:02:25-07:00</committed-date>
  <authored-date>2009-07-18T11:02:25-07:00</authored-date>
  <message>Moved shortcuts to its own module and allow recurrence to be included in any class.</message>
  <tree>7b7c67cd3aa359cd8c91291656b20d58e149b7c7</tree>
  <committer>
    <name>Jos&#233; Valim</name>
    <email>jose.valim@gmail.com</email>
  </committer>
</commit>
