Commit 145d068
Changed files (3)
lib
presentation
spec
presentation
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