Commit 145d068

mo khan <mo@mokhan.ca>
2014-03-22 04:32:09
create presenter factory.
1 parent 39b8d5d
Changed files (3)
lib/boot/container_configuration.rb
@@ -6,6 +6,7 @@ class ContainerConfiguration
     container.register(:shell_view) { |x| x.build(ShellView) }.as_singleton
     container.register(:shell_presenter) { |x| x.build(ShellPresenter) }.as_singleton
     container.register(:application_controller) { |x| x.build(ApplicationController) }.as_singleton
+    container.register(:presenter_factory) { |x| x.build(PresenterFactory) }.as_singleton
     container.register(:stock_service) { |x| StockService.new }.as_singleton
     Spank::IOC.bind_to(container)
   end
lib/presentation/presenter_factory.rb
@@ -0,0 +1,17 @@
+class PresenterFactory
+  def initialize(container)
+    @container = container
+  end
+
+  def create(presenter_key)
+    presenter = @container.resolve(presenter_key)
+    @container.resolve(create_view_key_from(presenter_key)).bind_to(presenter)
+    presenter
+  end
+
+  private
+
+  def create_view_key_from(presenter_key)
+    presenter_key.to_s.gsub(/presenter/, 'view').to_sym
+  end
+end
spec/presentation/presenter_factory_spec.rb
@@ -0,0 +1,26 @@
+require "spec_helper"
+
+describe PresenterFactory do
+  let(:container) { double }
+  subject { PresenterFactory.new(container) }
+
+  describe "#create" do
+    let(:presenter) { double }
+    let(:view) { double(bind_to: true) }
+
+    before :each do
+      container.stub(:resolve).with(:stock_presenter).and_return(presenter)
+      container.stub(:resolve).with(:stock_view).and_return(view)
+    end
+
+    let!(:result) { subject.create(:stock_presenter) }
+
+    it "returns a new presenter" do
+      result.should == presenter
+    end
+
+    it "should bind the view to the presenter" do
+      view.should have_received(:bind_to).with(presenter)
+    end
+  end
+end