Sauce-0.10.1
A C++ Dependency Injection Framework
implicit_bindings.h
1 #ifndef SAUCE_INTERNAL_IMPLICIT_BINDINGS_H_
2 #define SAUCE_INTERNAL_IMPLICIT_BINDINGS_H_
3 
4 #include <string>
5 #include <vector>
6 
7 #include <sauce/exceptions.h>
8 #include <sauce/injector.h>
9 #include <sauce/memory.h>
10 #include <sauce/provider.h>
11 #include <sauce/scopes.h>
12 #include <sauce/internal/resolved_binding.h>
13 #include <sauce/internal/binding.h>
14 #include <sauce/internal/bindings.h>
15 #include <sauce/internal/key.h>
16 
17 namespace sauce {
18 namespace internal {
19 
20 class ImplicitBindings;
21 
22 typedef Bindings<ImplicitBindings> Concrete;
23 
24 template<typename ImplicitInjection_>
26 public:
27  typedef ImplicitInjection_ ImplicitInjection;
28  typedef typename ImplicitInjection::Dependency Dependency;
29  typedef typename ResolvedBinding<Dependency>::BindingPtr BindingPtr;
30 };
31 
35 template<typename Dependency>
37 public:
38 
39  typedef sauce::shared_ptr<ResolvedBinding<Dependency> > BindingPtr;
40 
44  static BindingPtr get(Concrete const &, std::string const name) {
46  }
47 
48 };
49 
54 public:
55 
59  template<typename Dependency>
60  sauce::shared_ptr<ResolvedBinding<Dependency> > getProviding(
61  Concrete const & bindings, std::string const name) const {
62  return ImplicitBinding<Dependency>::get(bindings, name);
63  }
64 
68  template<typename Dependency>
69  std::vector<sauce::shared_ptr<ResolvedBinding<Dependency> > > getModifyings(
70  Concrete const &, std::string const) const {
71  return std::vector<sauce::shared_ptr<ResolvedBinding<Dependency> > >(); // TODO
72  }
73 
74 };
75 
79 template<>
81 public:
82  static BindingPtr get(Concrete const &, std::string const name) {
83  if (name != unnamed()) {
85  }
86  BindingPtr binding(new ImplicitInjection());
87  return binding;
88  }
89 };
90 
94 template<typename ProvidedDependency, typename Name>
95 class ImplicitBinding<Named<Provider<ProvidedDependency>, Name> > {
96 public:
98  typedef typename Traits::ImplicitInjection ImplicitInjection;
99  typedef typename Traits::Dependency Dependency;
100  typedef typename Traits::BindingPtr BindingPtr;
101 
102  static BindingPtr get(Concrete const & bindings, std::string const name) {
103  typedef typename Key<ProvidedDependency>::Normalized Normalized;
104  typedef typename ResolvedBinding<Normalized>::BindingPtr ProvidedBindingPtr;
105 
106  ProvidedBindingPtr providedBinding(bindings.getProvidingBinding<Normalized>(name));
107  BindingPtr binding(new ImplicitInjection(providedBinding));
108  return binding;
109  }
110 };
111 
112 }
113 
114 namespace i = ::sauce::internal;
115 
116 }
117 
118 #endif // SAUCE_INTERNAL_IMPLICIT_BINDINGS_H_