diff --git a/lib/smithy/service_locator.rb b/lib/smithy/service_locator.rb new file mode 100644 index 0000000..d4e29e7 --- /dev/null +++ b/lib/smithy/service_locator.rb @@ -0,0 +1,29 @@ +require "smithy/container" + +module Smithy + module ServiceLocator + class << self + attr_reader :container + + def included(base) + base.extend(ClassMethods) + end + + def register_container(container) + @container = container + end + end + + module ClassMethods + private + + def dependency(name) + define_method name do + ServiceLocator.container.instance(name) + end + + private name + end + end + end +end diff --git a/spec/smithy/service_locator_spec.rb b/spec/smithy/service_locator_spec.rb new file mode 100644 index 0000000..121583d --- /dev/null +++ b/spec/smithy/service_locator_spec.rb @@ -0,0 +1,35 @@ +require "smithy/service_locator" + +describe Smithy::ServiceLocator do + class Dependency + def value + :expected_result + end + end + + class ExampleServiceLocator + include Smithy::ServiceLocator + + dependency :foo + + def test + foo.value + end + end + + let(:container) { Smithy::Container.new } + let(:test_object) { ExampleServiceLocator.new } + + before do + container.register(:foo, Dependency) + Smithy::ServiceLocator.register_container(container) + end + + it "provides requested dependencies" do + test_object.test.should == :expected_result + end + + it "makes the dependencies private" do + test_object.private_methods.should include(:foo) + end +end