<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>app/models/message_recipient/easy_build_bcc_extension.rb</filename>
    </added>
    <added>
      <filename>app/models/message_recipient/easy_build_cc_extension.rb</filename>
    </added>
    <added>
      <filename>app/models/message_recipient/easy_build_extension.rb</filename>
    </added>
    <added>
      <filename>app/models/message_recipient/easy_build_to_extension.rb</filename>
    </added>
    <added>
      <filename>app/models/receiver_message.rb</filename>
    </added>
    <added>
      <filename>app/models/sender_message.rb</filename>
    </added>
    <added>
      <filename>lib/has_messages.rb</filename>
    </added>
    <added>
      <filename>test/app_root/app/models/user.rb</filename>
    </added>
    <added>
      <filename>test/app_root/config/environment.rb</filename>
    </added>
    <added>
      <filename>test/app_root/db/migrate/001_create_users.rb</filename>
    </added>
    <added>
      <filename>test/app_root/test/fixtures/message_recipients.yml</filename>
    </added>
    <added>
      <filename>test/app_root/test/fixtures/messages.yml</filename>
    </added>
    <added>
      <filename>test/app_root/test/fixtures/users.yml</filename>
    </added>
    <added>
      <filename>test/test_helper.rb</filename>
    </added>
    <added>
      <filename>test/unit/has_messages_test.rb</filename>
    </added>
    <added>
      <filename>test/unit/message_box_test.rb</filename>
    </added>
    <added>
      <filename>test/unit/message_recipient_test.rb</filename>
    </added>
    <added>
      <filename>test/unit/message_test.rb</filename>
    </added>
    <added>
      <filename>test/unit/receiver_message_test.rb</filename>
    </added>
    <added>
      <filename>test/unit/recipient_extension_test.rb</filename>
    </added>
    <added>
      <filename>test/unit/sender_message_test.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,12 +1,12 @@
-= acts_as_messageable
+= has_messages
 
-acts_as_messageable .
+has_messages .
 
 == Resources
 
 Wiki
 
-* http://wiki.pluginaweek.org/Acts_as_messageable
+* http://wiki.pluginaweek.org/Has_messages
 
 Announcement
 
@@ -14,17 +14,12 @@ Announcement
 
 Source
 
-* http://svn.pluginaweek.org/trunk/plugins/active_record/acts/acts_as_messageable
+* http://svn.pluginaweek.org/trunk/plugins/active_record/has/has_messages
 
 Development
 
-* http://dev.pluginaweek.org/browser/trunk/plugins/active_record/acts/acts_as_messageable
+* http://dev.pluginaweek.org/browser/trunk/plugins/active_record/has/has_messages
 
 == Description
 
 
-
-== Migrations
-
-rake db:migrate:plugins PLUGIN=acts_as_state_machine
-rake db:migrate:plugins PLUGIN=acts_as_messageable
\ No newline at end of file</diff>
      <filename>README</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@ require 'rake/rdoctask'
 require 'rake/gempackagetask'
 require 'rake/contrib/sshpublisher'
 
-PKG_NAME           = 'acts_as_messageable'
+PKG_NAME           = 'has_messages'
 PKG_VERSION        = '0.0.1'
 PKG_FILE_NAME      = &quot;#{PKG_NAME}-#{PKG_VERSION}&quot;
 RUBY_FORGE_PROJECT = 'pluginaweek'
@@ -11,17 +11,17 @@ RUBY_FORGE_PROJECT = 'pluginaweek'
 desc 'Default: run unit tests.'
 task :default =&gt; :test
 
-desc 'Test the acts_as_messageable plugin.'
+desc 'Test the has_messages plugin.'
 Rake::TestTask.new(:test) do |t|
   t.libs &lt;&lt; 'lib'
-  t.pattern = 'test/**/*_test.rb'
+  t.pattern = 'test/unit/**/*_test.rb'
   t.verbose = true
 end
 
-desc 'Generate documentation for the acts_as_messageable plugin.'
+desc 'Generate documentation for the has_messages plugin.'
 Rake::RDocTask.new(:rdoc) do |rdoc|
   rdoc.rdoc_dir = 'rdoc'
-  rdoc.title    = 'ActsAsMessageable'
+  rdoc.title    = 'HasMessages'
   rdoc.options &lt;&lt; '--line-numbers' &lt;&lt; '--inline-source'
   rdoc.rdoc_files.include('README')
   rdoc.rdoc_files.include('lib/**/*.rb')
@@ -35,7 +35,7 @@ spec = Gem::Specification.new do |s|
   
   s.files           = FileList['{app,db,lib,tasks,test}/**/*'].to_a + %w(init.rb MIT-LICENSE Rakefile README)
   s.require_path    = 'lib'
-  s.autorequire     = 'acts_as_messageable'
+  s.autorequire     = 'has_messages'
   s.has_rdoc        = true
   s.test_files      = Dir['test/**/*_test.rb']
   </diff>
      <filename>Rakefile</filename>
    </modified>
    <modified>
      <diff>@@ -1,140 +1,40 @@
 # 
 class Message &lt; ActiveRecord::Base
-  acts_as_state_machine :initial =&gt; Proc.new {|message| message.recipient ? :unread : :unsent}
+  has_states :initial =&gt; :deleted
   
-  belongs_to    :from,
-                  :polymorphic =&gt; true
-  belongs_to    :recipient,
-                  :polymorphic =&gt; true
-  
-  # Add associations for different types of recipients:
-  # * to - Your direct recipients
-  # * cc - Carbon copies
-  # * bcc - Blind carbon copies
-  with_options(
-    :class_name =&gt; 'MessageRecipient',
-    :foreign_key =&gt; 'message_id',
-    :order =&gt; 'position ASC',
-    :extend =&gt; Message::EasyBuildRecipientExtension
-  ) do |w|
-    w.has_many  :to,
-                  :conditions =&gt; ['kind = ?', 'to']
-    w.has_many  :cc,
-                  :conditions =&gt; ['kind = ?', 'cc']
-    w.has_many  :bcc,
-                  :conditions =&gt; ['kind = ?', 'bcc']
-  end
-  
-  # Support reading from, to, cc, and bcc from the reference message
-  # if this message was forwarded
-  [:from, :to, :cc, :bcc].each do |method|
-    eval &lt;&lt;-end_eval
-      def #{method}_with_reference_message
-        recipient ? reference_message.#{method} : #{method}_without_reference_message
-      end
-      alias_method_chain :#{method}, :reference_message
-    end_eval
-  end
-  
-  # Reference messages are used for forwarding so that we don't duplicate data
-  # and so we can track where it came from
-  belongs_to    :reference_message,
-                  :class_name =&gt; 'Message',
-                  :foreign_key =&gt; 'reference_message_id'
-  
-  validates_xor_presence_of :from_id,
-                            :recipient_id,
-                              :if =&gt; :only_model_participants?
-  
-  state :unsent
-  state :queued
-  state :sent, :after_enter =&gt; :deliver
-  state :unread
-  state :read
   state :deleted
   
-  # Queues the message so that it is sent in a separate process
-  event :queue do
-    transition_to :queued, :from =&gt; :unsent,
-                    :if =&gt; Proc.new {|message| message.number_of_recipients &gt; 0}
-  end
-  
-  # Sends the message to all of the recipients as long as at least one
-  # recipient has been aded
-  event :send do
-    transition_to :sent, :from =&gt; [:unsent, :queued],
-                    :if =&gt; Proc.new {|message| message.number_of_recipients &gt; 0}
-  end
-  
-  # Indicates that the message has been viewed by the recipient of this
-  # message
-  event :view do
-    transition_to :read, :from =&gt; :unread
-  end
+  validates_presence_of :owner_id,
+                        :state_id
   
-  # Deletes the message
-  event :delete do
-    transition_to :deleted, :from =&gt; [:unread, :read, :sent]
-  end
-  
-  [:subject, :body].each do |method|
-    class_eval &lt;&lt;-end_eval
-      def #{method}
-        from ? read_attribute(:#{method}) : reference_message.#{method}
-      end
-    end_eval
-  end
-  
-  # Support getting all of the messageables of the message's
-  # recipients regardless of whether cross-model messaging is being
-  # allowed
+  # Support getting all of the messageables of the message's recipients
   [:to, :cc, :bcc].each do |method|
     eval &lt;&lt;-end_eval
-      def #{method}_recipients
+      def #{method}_receivers
         #{method}.collect {|recipient| recipient.messageable}
       end
     end_eval
   end
   
   # 
-  def all_recipients
-    to + cc + bcc
+  def all_receivers
+    all_recipients.collect {|recipient| recipient.messageable}
   end
   
   # 
   def number_of_recipients
-    to.size + cc.size + bcc.size
+    all_recipients.size
   end
   
   # 
-  def forward
-    message = self.class.new
-    message.reference_message = self
-    message
-  end
-  
-  private
-  # Are only models allowed to be the from/recipient of this message?  Or can
-  # other classes, like strings, be allowed?
-  def only_model_participants?
-    true
-  end
-  
-  # Copies the current message to all recipients
-  def copy_to_recipients
-    received_messages = &quot;received_#{self.class.name.underscore.pluralize}&quot;
-    
-    (to + cc + bcc).each do |recipient|
-      if recipient.messageable.respond_to?(received_messages)
-        message = recipient.messageable.send(received_messages).build
-      else
-        message = self.class.new
-        message.recipient = recipient.messageable
+  def reply_to_all
+    message = reply
+    [:cc, :bcc].each do |recipient_type|
+      send(recipient_type).each do |recipient|
+        message.send(recipient_type) &lt;&lt; recipient.messageable
       end
-      
-      message.reference_message = self
-      message.save
     end
+    
+    message
   end
-  alias_method :deliver, :copy_to_recipients
 end</diff>
      <filename>app/models/message.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,10 @@
-# 
+# Contains the received and sent messages for a particular box
 class MessageBox
   attr_reader :inbox,
+              :unsent,
               :sent
   
-  def initialize(inbox, sent)
-    @inbox, @sent = inbox, sent
+  def initialize(inbox, unsent, sent)
+    @inbox, @unsent, @sent = inbox, unsent, sent
   end
 end
\ No newline at end of file</diff>
      <filename>app/models/message_box.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,11 +1,43 @@
 # Represents a recipient of a message
 class MessageRecipient &lt; ActiveRecord::Base
-  acts_as_list          :scope =&gt; 'message_id = #{message_id} AND kind = #{quote_value(kind)}'
+  acts_as_list :scope =&gt; 'message_id = #{message_id} AND kind = #{quote_value(kind)}'
   
-  belongs_to            :message
-  belongs_to            :messageable,
-                          :polymorphic =&gt; true
+  has_states  :initial =&gt; :unsent
+  
+  state :unsent,
+        :sent
+  
+  event :deliver do
+    transition_to :sent, :from =&gt; :unsent
+  end
+  
+  belongs_to  :message,
+                :class_name =&gt; 'SenderMessage',
+                :foreign_key =&gt; 'message_id'
+  belongs_to  :messageable,
+                :polymorphic =&gt; true
+  has_one     :receiver_message,
+                :foreign_key =&gt; 'owner_id'
+  has_many    :receiver_messages,
+                :foreign_key =&gt; 'owner_id'
+#                :as =&gt; :owner,
+#                :source_type =&gt; nil
   
   validates_presence_of :message_id,
-                        :kind
+                        :kind,
+                        :state_id
+  validates_presence_of :messageable_id,
+                        :messageable_type,
+                          :if =&gt; :model_participant?
+  
+  # 
+  def deliver
+    message = build_receiver_message
+    message.save!
+  end
+  
+  private
+  def model_participant?
+    true
+  end
 end
\ No newline at end of file</diff>
      <filename>app/models/message_recipient.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,29 +1,24 @@
-&lt;%
-type = &lt;&lt;-EOV
-owner_type: 'Message'
-EOV
-%&gt;
-
-queue:
-  id: 501
+delete:
+  id: 500
+  name: delete
+  owner_type: Message
+  
+sender_deliver:
+  id: 510
+  name: deliver
+  owner_type: SenderMessage
+  
+sender_queue:
+  id: 511
   name: queue
-  long_description: Queues the messages to be sent at a later time
-  &lt;%= type %&gt;
+  owner_type: SenderMessage
   
-send:
-  id: 502
-  name: send
-  long_description: The message has been sent
-  &lt;%= type %&gt;
+recipient_deliver:
+  id: 520
+  name: deliver
+  owner_type: MessageRecipient
   
-view:
-  id: 503
+receiver_view:
+  id: 530
   name: view
-  long_description: The message has been view
-  &lt;%= type %&gt;
-  
-delete:
-  id: 504
-  name: delete
-  long_description: The message has been deleted
-  &lt;%= type %&gt;
\ No newline at end of file
+  owner_type: ReceiverMessage
\ No newline at end of file</diff>
      <filename>db/bootstrap/events.yml</filename>
    </modified>
    <modified>
      <diff>@@ -1,41 +1,34 @@
-&lt;%
-type = &lt;&lt;-EOV
-owner_type: 'Message'
-EOV
-%&gt;
-
-unsent:
-  id: 501
+deleted:
+  id: 500
+  name: deleted
+  owner_type: Message
+  
+sender_unsent:
+  id: 510
   name: unsent
-  long_description: The message has not been sent yet.
-  &lt;%= type %&gt;
+  owner_type: SenderMessage
   
-queued:
-  id: 502
-  name: queued
-  long_description: The message has been queued to be sent at a later time.
-  &lt;%= type %&gt;
+sender_sent:
+  id: 511
+  name: sent
+  owner_type: SenderMessage
   
-sent:
-  id: 503
+recipient_unsent:
+  id: 520
+  name: unsent
+  owner_type: MessageRecipient
+  
+recipient_sent:
+  id: 521
   name: sent
-  long_description: The message has been sent.
-  &lt;%= type %&gt;
+  owner_type: MessageRecipient
   
-unread:
-  id: 504
+receiver_unread:
+  id: 530
   name: unread
-  long_description: The message has not been read yet.
-  &lt;%= type %&gt;
+  owner_type: ReceiverMessage
   
-read:
-  id: 505
+receiver_read:
+  id: 531
   name: read
-  long_description: The message has been read.
-  &lt;%= type %&gt;
-  
-deleted:
-  id: 506
-  name: deleted
-  long_description: The message has been deleted.
-  &lt;%= type %&gt;
\ No newline at end of file
+  owner_type: ReceiverMessage
\ No newline at end of file</diff>
      <filename>db/bootstrap/states.yml</filename>
    </modified>
    <modified>
      <diff>@@ -1,48 +1,20 @@
 class CreateMessages &lt; ActiveRecord::Migration
-  class Message &lt; ActiveRecord::Base; end
-  class StateChange &lt; ActiveRecord::Base; end
-  class StateDeadline &lt; ActiveRecord::Base; end
-  
-  class State &lt; ActiveRecord::Base
-    set_table_name 'states'
-    
-    has_many :messages, :class_name =&gt; Message.to_s, :dependent =&gt; :destroy
-    has_many :from_changes, :class_name =&gt; StateChange.to_s, :foreign_key =&gt; 'from_state_id', :dependent =&gt; :destroy
-    has_many :to_changes, :class_name =&gt; StateChange.to_s, :foreign_key =&gt; 'to_state_id', :dependent =&gt; :destroy
-  end
-  
-  class Event &lt; ActiveRecord::Base
-    set_table_name 'events'
-    
-    has_many :state_changes, :class_name =&gt; StateChange.to_s, :foreign_key =&gt; 'event_id', :dependent =&gt; :destroy
-    has_many :state_deadlines, :class_name =&gt; StateDeadline.to_s, :foreign_key =&gt; 'event_id', :dependent =&gt; :destroy
-  end
-  
   def self.up
     create_table :messages do |t|
-      t.column :from_id,              :integer,   :null =&gt; false, :unsigned =&gt; true, :references =&gt; nil
-      t.column :from_type,            :string,    :null =&gt; false
-      t.column :recipient_id,         :integer,   :null =&gt; false, :unsigned =&gt; true, :references =&gt; nil
-      t.column :recipient_type,       :string,    :null =&gt; false
-      t.column :reference_message_id, :integer,   :unsigned =&gt; true, :references =&gt; :messages
-      t.column :subject,              :text,      :null =&gt; false
-      t.column :body,                 :text,      :null =&gt; false
-      t.column :created_at,           :datetime,  :null =&gt; false
+      t.column :owner_id, :integer, :null =&gt; false, :references =&gt; nil
+      t.column :owner_type, :string
+      t.column :subject, :text
+      t.column :body, :text
+      t.column :created_at, :datetime, :null =&gt; false
+      t.column :type, :string, :null =&gt; false
     end
     
-    PluginAWeek::Acts::StateMachine.migrate_up(:messages)
+    PluginAWeek::Has::States.migrate_up(:messages)
   end
 
   def self.down
-    PluginAWeek::Acts::StateMachine.migrate_down(:messages)
+    PluginAWeek::Has::States.migrate_down(:messages)
     
     drop_table :messages
   end
-  
-  def self.bootstrap
-    {
-      :states =&gt; {:class =&gt; State, :conditions =&gt; ['owner_type = ?', 'Message']},
-      :events =&gt; {:class =&gt; Event, :conditions =&gt; ['owner_type = ?', 'Message']}
-    }
-  end
 end
\ No newline at end of file</diff>
      <filename>db/migrate/001_create_messages.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,17 +1,20 @@
 class CreateMessageRecipients &lt; ActiveRecord::Migration
   def self.up
     create_table :message_recipients do |t|
-      t.column :message_id,       :integer, :null =&gt; false, :unsigned =&gt; true
-      t.column :messageable_id,   :integer, :null =&gt; false, :unsigned =&gt; true, :references =&gt; nil
-      t.column :messageable_type, :string,  :null =&gt; false
-      t.column :kind,             :string,  :null =&gt; false, :default =&gt; 'to'
-      t.column :position,         :integer, :null =&gt; false
+      t.column :message_id, :integer, :null =&gt; false
+      t.column :messageable_id, :integer, :null =&gt; false, :references =&gt; nil
+      t.column :messageable_type, :string, :null =&gt; false
+      t.column :kind, :string, :null =&gt; false, :default =&gt; 'to'
+      t.column :position, :integer, :null =&gt; false
     end
-    add_index :message_recipients, [:message_id, :messageable_id, :messageable_type], :unique =&gt; true, :name =&gt; 'index_message_recipients_on_message_id_and_messageable'
     add_index :message_recipients, [:message_id, :kind, :position], :unique =&gt; true
+    
+    PluginAWeek::Has::States.migrate_up(:message_recipients)
   end
   
   def self.down
+    PluginAWeek::Has::States.migrate_down(:message_recipients)
+    
     drop_table :message_recipients
   end
 end
\ No newline at end of file</diff>
      <filename>db/migrate/002_create_message_recipients.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1 @@
-require 'acts_as_messageable'
\ No newline at end of file
+require 'has_messages'
\ No newline at end of file</diff>
      <filename>init.rb</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>app/models/message/easy_build_recipient_extension.rb</filename>
    </removed>
    <removed>
      <filename>lib/acts_as_messageable.rb</filename>
    </removed>
    <removed>
      <filename>test/acts_as_messageable_test.rb</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>ae63f8b9510fab02ac91b2e093cc1b050aa7eb99</id>
    </parent>
  </parents>
  <author>
    <name>Aaron Pfeifer</name>
    <email>aaron.pfeifer@gmail.com</email>
  </author>
  <url>http://github.com/pluginaweek/has_messages/commit/dd028bdcbc7aaeda88bdb3d45838a6e78d8c3f43</url>
  <id>dd028bdcbc7aaeda88bdb3d45838a6e78d8c3f43</id>
  <committed-date>2007-07-29T14:06:41-07:00</committed-date>
  <authored-date>2007-07-29T14:06:41-07:00</authored-date>
  <message>Initial release</message>
  <tree>5f2c194a7e76a7a35cac6332484cb06aca1f7c0b</tree>
  <committer>
    <name>Aaron Pfeifer</name>
    <email>aaron.pfeifer@gmail.com</email>
  </committer>
</commit>
