<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>lib/nanite/actor_registry.rb</filename>
    </added>
    <added>
      <filename>spec/actor_registry_spec.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -29,7 +29,8 @@ In your Nanites you can have any number of actor classes.  These actors are like
 in Rails or Merb and this is where you implement your own custom functionality.  An actor looks
 like:
 
-  class Foo &lt; Nanite::Actor
+  class Foo
+    include Nanite::Actor
     expose :bar
     def bar(payload)
       &quot;got payload: #{payload}&quot;
@@ -321,7 +322,7 @@ The easiest way to verify it is by starting two separate Erlang shells like this
   $ erl -sname fred
   (fred@odin)1&gt;
 
-  $erl -sname bob
+  $ erl -sname bob
   (bob@odin)1&gt;
 
 And then trying to 'ping' one from the other. In the 'fred' node you can do that like this:</diff>
      <filename>README.rdoc</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,6 @@
-class Rabbit &lt; Nanite::Actor
+class Rabbit
+  include Nanite::Actor
+  
   expose :add_user,:delete_user, :change_password, :list_users,
          :add_vhost, :delete_vhost, :list_vhosts,
          :map_user_vhost, :unmap_user_vhost, :list_user_vhosts, :list_vhost_users,</diff>
      <filename>examples/rabbitmqctl/actors/rabbit.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,5 @@
-class RackWorker &lt; Nanite::Actor
+class RackWorker
+  include Nanite::Actor
   expose :call
 
   def initialize(app)</diff>
      <filename>examples/rack-worker/actors/rack_worker.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,7 @@
 # you can execute this nanite from the cli.rb command line example app
 
-class Simple &lt; Nanite::Actor
+class Simple
+  include Nanite::Actor
   expose :echo, :time, :gems
 
   def echo(payload)</diff>
      <filename>examples/simpleagent/actors/simple.rb</filename>
    </modified>
    <modified>
      <diff>@@ -16,6 +16,7 @@ require 'nanite/daemonize'
 require 'nanite/job'
 require 'nanite/mapper'
 require 'nanite/actor'
+require 'nanite/actor_registry'
 require 'nanite/streaming'
 require 'nanite/dispatcher'
 require 'nanite/agent'</diff>
      <filename>lib/nanite.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,61 +1,64 @@
 module Nanite
-  class Actor
-    def self.default_prefix
-      to_s.to_const_path
-    end
+  # This mixin provides Nanite actor functionality.
+  #
+  # To use it simply include it your class containing the functionality to be exposed:
+  #
+  #   class Foo
+  #     include Nanite::Actor
+  #     expose :bar
+  #
+  #     def bar(payload)
+  #       # ...
+  #     end
+  #
+  #   end
+  module Actor
 
-    def self.expose(*meths)
-      @exposed ||= []
-      meths.each do |meth|
-        @exposed &lt;&lt; meth
+    def self.included(base)
+      base.class_eval do 
+        include Nanite::Actor::InstanceMethods
+        extend  Nanite::Actor::ClassMethods
+      end # base.class_eval
+    end # self.included
+    
+    module ClassMethods
+      def default_prefix
+        to_s.to_const_path
       end
-    end
 
-    def self.provides_for(prefix)
-      return [] unless @exposed
-      @exposed.map {|meth| &quot;/#{prefix}/#{meth}&quot;.squeeze('/')}
-    end
-
-    def self.on_exception(proc = nil, &amp;blk)
-      raise 'No callback provided for on_exception' unless proc || blk
-      if Nanite::Actor == self
-        raise 'Method name callbacks cannot be used on the Nanite::Actor superclass' if Symbol === proc || String === proc
-        @superclass_exception_callback = proc || blk
-      else
-        @instance_exception_callback = proc || blk
+      def expose(*meths)
+        @exposed ||= []
+        meths.each do |meth|
+          @exposed &lt;&lt; meth unless @exposed.include?(meth)
+        end
       end
-    end
-
-    def self.superclass_exception_callback
-      @superclass_exception_callback
-    end
-
-    def self.instance_exception_callback
-      @instance_exception_callback
-    end
-  end
-
-  class ActorRegistry
-    attr_reader :actors, :log
 
-    def initialize(log)
-      @log = log
-      @actors = {}
-    end
+      def provides_for(prefix)
+        return [] unless @exposed
+        @exposed.map {|meth| &quot;/#{prefix}/#{meth}&quot;.squeeze('/')}
+      end
 
-    def register(actor, prefix)
-      raise ArgumentError, &quot;#{actor.inspect} is not a Nanite::Actor subclass instance&quot; unless Nanite::Actor === actor
-      log.info(&quot;Registering #{actor.inspect} with prefix #{prefix.inspect}&quot;)
-      prefix ||= actor.class.default_prefix
-      actors[prefix.to_s] = actor
-    end
+      def on_exception(proc = nil, &amp;blk)
+        raise 'No callback provided for on_exception' unless proc || blk
+        if Nanite::Actor == self
+          raise 'Method name callbacks cannot be used on the Nanite::Actor superclass' if Symbol === proc || String === proc
+          @superclass_exception_callback = proc || blk
+        else
+          @instance_exception_callback = proc || blk
+        end
+      end
 
-    def services
-      actors.map {|prefix, actor| actor.class.provides_for(prefix) }.flatten.uniq
-    end
+      def superclass_exception_callback
+        @superclass_exception_callback
+      end
 
-    def actor_for(prefix)
-      actor = actors[prefix]
-    end
-  end
-end
\ No newline at end of file
+      def instance_exception_callback
+        @instance_exception_callback
+      end
+    end # ClassMethods     
+    
+    module InstanceMethods
+    end # InstanceMethods
+    
+  end # Actor
+end # Nanite
\ No newline at end of file</diff>
      <filename>lib/nanite/actor.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,19 +1,24 @@
 require File.dirname(__FILE__) + '/spec_helper'
 require 'nanite'
 
-class WebDocumentImporter &lt; Nanite::Actor
+class WebDocumentImporter
+  include Nanite::Actor
   expose :import, :cancel
-  
+
   def import
     1
   end
   def cancel
     0
   end
+  def continue
+    1
+  end
 end
 
 module Actors
-  class ComedyActor &lt; Nanite::Actor
+  class ComedyActor
+    include Nanite::Actor
     expose :fun_tricks
     def fun_tricks
       :rabbit_in_the_hat
@@ -22,14 +27,21 @@ module Actors
 end
 
 describe Nanite::Actor do
+  
+  describe &quot;.expose&quot; do
+    it &quot;should single expose method only once&quot; do
+      3.times { WebDocumentImporter.expose(:continue) }
+      WebDocumentImporter.provides_for(&quot;webfiles&quot;).should == [&quot;/webfiles/import&quot;, &quot;/webfiles/cancel&quot;, &quot;/webfiles/continue&quot;]
+    end
+  end
+  
   describe &quot;.default_prefix&quot; do
     it &quot;is calculated as default prefix as const path of class name&quot; do
-      Nanite::Actor.default_prefix.should       == &quot;nanite/actor&quot;
       Actors::ComedyActor.default_prefix.should == &quot;actors/comedy_actor&quot;
       WebDocumentImporter.default_prefix.should == &quot;web_document_importer&quot;
-    end    
+    end
   end
-  
+
   describe &quot;.provides_for(prefix)&quot; do
     before :each do
       @provides = Actors::ComedyActor.provides_for(&quot;money&quot;)
@@ -46,32 +58,3 @@ describe Nanite::Actor do
     end
   end
 end
-
-describe Nanite::ActorRegistry do
-  before(:each) do
-    log = mock('log', :info =&gt; nil)
-    @registry = Nanite::ActorRegistry.new(log)
-  end
-
-  it &quot;should know about all services&quot; do
-    @registry.register(WebDocumentImporter.new, nil)
-    @registry.register(Actors::ComedyActor.new, nil)
-    @registry.services.should == [&quot;/actors/comedy_actor/fun_tricks&quot;, &quot;/web_document_importer/import&quot;, &quot;/web_document_importer/cancel&quot;]
-  end
-
-  it &quot;should not register anything except Nanite::Actor&quot; do
-    lambda{@registry.register(String.new, nil)}.should raise_error(ArgumentError)
-  end
-
-  it &quot;should register an actor&quot; do
-    importer = WebDocumentImporter.new
-    @registry.register(importer, nil)
-    @registry.actors['web_document_importer'].should == importer
-  end
-
-  it &quot;should handle actors registered with a custom prefix&quot; do
-    importer = WebDocumentImporter.new
-    @registry.register(importer, 'monkey')
-    @registry.actors['monkey'].should == importer
-  end
-end
\ No newline at end of file</diff>
      <filename>spec/actor_spec.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,8 +1,8 @@
 require File.dirname(__FILE__) + '/spec_helper'
 require 'nanite'
 
-class Foo &lt; Nanite::Actor
-
+class Foo
+  include Nanite::Actor
   expose :bar, :index, :i_kill_you
   on_exception :handle_exception
 
@@ -22,8 +22,8 @@ class Foo &lt; Nanite::Actor
   end
 end
 
-class Bar &lt; Nanite::Actor
-
+class Bar
+  include Nanite::Actor
   expose :i_kill_you
   on_exception do |method, deliverable, error|
     @scope = self
@@ -37,7 +37,8 @@ end
 
 # No specs, simply ensures multiple methods for assigning on_exception callback,
 # on_exception raises exception when called with an invalid argument.
-class Doomed &lt; Nanite::Actor
+class Doomed
+  include Nanite::Actor
   on_exception do
   end
   on_exception lambda {}
@@ -77,14 +78,6 @@ describe &quot;Nanite::Dispatcher&quot; do
     @dispatcher.dispatch(req)
   end
 
-  it &quot;should call the on_exception callback defined on the superclass&quot; do
-    callback = lambda {|actor, method, deliverable, error|}
-    Nanite::Actor.on_exception callback
-    req = Nanite::Request.new('/foo/i_kill_you', nil)
-    callback.should_receive(:call).with(@actor, :i_kill_you, req, duck_type(:exception, :backtrace))
-    @dispatcher.dispatch(req)
-  end
-
   it &quot;should call on_exception Procs defined in a subclass with the correct arguments&quot; do
     actor = Bar.new
     @registry.register(actor, nil)</diff>
      <filename>spec/dispatcher_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>c6eb18b77a0a053e5879136cd2dfd16e2ffdac89</id>
    </parent>
  </parents>
  <author>
    <name>ck</name>
    <email>ckatgithub@gmail.com</email>
  </author>
  <url>http://github.com/ezmobius/nanite/commit/791197244f5f1ae1f915ba49b69269a89756add5</url>
  <id>791197244f5f1ae1f915ba49b69269a89756add5</id>
  <committed-date>2009-02-19T19:32:22-08:00</committed-date>
  <authored-date>2009-02-19T19:32:22-08:00</authored-date>
  <message>Refactored Nanite::Actor.

Made following changes around Nanite:Actor:

- Made Actor a module to be included in any class.
- Allow same method to be included in @exposed list only once.
- Created own file for ActorRegistry.
- Updated specs to reflect refactoring.
- Updated examples to reflect refactoring.</message>
  <tree>2eaa6a80fdab01363acfc33ebcf06dd04f0e71af</tree>
  <committer>
    <name>ck</name>
    <email>ckatgithub@gmail.com</email>
  </committer>
</commit>
