Untangle
This gem provides a very lightweight API to specify dependencies between objects. The key concepts behind it are:
- Make dependencies of your objects visible by declaring them
- Depend on roles, not implementation
- Simplify testing by substituting your dependencies with mocks
Installation
gem install untangle
Define Dependencies
explicit
Explicit definitions contain a direct reference to the actual dependency. The reference can either be a String:
class Person
extend Untangle
dependency :translator, 'I18n'
end
or a block:
class Person
extend Untangle
dependency(:translator) { I18n }
end
implicit
Implicit definitions have no reference to the actual dependency. The
implementation will be inferred from the name. In the following
example, the dependency would resolve to Translator.
class Person
extend Untangle
dependency :translator
end
Global Dependencies
If you have global dependencies, which are used throughout your app,
you can register them globally. This way you can use dependency
implicit definitions without a name that corresponds to the implementation.
Untangle.register :translator, 'I18n'
class Blog
extend Untangle
dependency :translator
end
You can also use these registered dependencies to inject them into a
constructor. This technique does not require that the object under
construction knows about explicit_dependencies
Untangle.register :translator, 'I18n'
ExplicitDependencies.register :people_repository, 'PeopleRepository'
class MyPrcoess
# The argument names must match the registered dependencies
def initialize(translator, people_repository)
end
end
Untangle.inject(MyProcess, :new)