1 #ifndef SAUCE_INTERNAL_METHOD_BINDING_H_
2 #define SAUCE_INTERNAL_METHOD_BINDING_H_
4 #include <sauce/injector.h>
5 #include <sauce/scopes.h>
6 #include <sauce/internal/apply_variadic.h>
7 #include <sauce/internal/binding.h>
8 #include <sauce/internal/resolved_binding.h>
13 template<
typename Dependency,
typename Signature>
21 struct MethodBindingFriend {
23 void validateAcyclicHelper(MethodBinding_
const & binding, InjectorPtr injector, TypeIds & ids, std::string name) {
24 binding.template validateAcyclicHelper<T>(injector, ids, name);
28 typename Key<T>::Ptr injectHelper(MethodBinding_
const & binding, InjectorPtr injector, std::string name) {
29 typename Key<T>::Ptr injected;
30 binding.template injectHelper<typename i::Key<T>::Normalized>(injected, injector, name);
35 friend class MethodBindingFriend;
37 struct InjectParameters {
39 MethodBinding_
const & binding;
40 InjectorPtr & injector;
42 Passed(MethodBinding_
const & binding, InjectorPtr & injector):
43 binding(binding), injector(injector) {}
46 template<
typename T,
int i>
48 typedef typename Key<T>::Ptr Type;
50 template<
typename Passed>
51 Type yield(
Passed passed) {
52 MethodBinding_
const & binding = passed.binding;
53 InjectorPtr & injector = passed.injector;
54 std::string dependencyName = binding.dynamicDependencyNames[
i];
56 return this->MethodBindingFriend::template injectHelper<T>(binding, injector, dependencyName);
65 std::vector<std::string> dynamicDependencyNames;
67 struct ValidateAcyclicParameters {
69 MethodBinding_
const & binding;
70 InjectorPtr & injector;
73 Passed(MethodBinding_
const & binding, InjectorPtr & injector, TypeIds & ids):
74 binding(binding), injector(injector), ids(ids) {}
77 template<
typename T,
int i>
79 typedef typename Key<T>::Ptr Type;
81 template<
typename Passed>
82 void observe(
Passed passed) {
83 MethodBinding_
const & binding = passed.binding;
84 InjectorPtr & injector = passed.injector;
85 TypeIds & ids = passed.ids;
86 std::string dependencyName = binding.dynamicDependencyNames[
i];
88 this->MethodBindingFriend::template validateAcyclicHelper<T>(binding, injector, ids, dependencyName);
94 typedef typename Inject::Method Method;
99 bool isModifier()
const {
103 void validateAcyclic(InjectorPtr injector, TypeIds & ids)
const {
104 typename ValidateAcyclicParameters::Passed passed(*
this, injector, ids);
105 observeMethod<ValidateAcyclicParameters, Signature>(method, passed);
108 void setDynamicDependencyNames(std::vector<std::string>
const & dynamicDependencyNames) {
109 this->dynamicDependencyNames = dynamicDependencyNames;
110 this->dynamicDependencyNames.resize(Inject::arity(), unnamed());
115 typedef typename ResolvedBinding<Dependency>::BindingPtr BindingPtr;
117 explicit MethodBinding(Method method):
118 dynamicDependencyNames(Inject::arity(), unnamed()),
121 void inject(IfacePtr & injected, BindingPtr, InjectorPtr injector)
const {
123 applyMethod<InjectParameters, Signature>(*injected.get(), method, passed);
130 namespace i = ::sauce::internal;
134 #endif // SAUCE_INTERNAL_METHOD_BINDING_H_
Definition: method_binding.h:38
Definition: method_binding.h:78
void inject(IfacePtr &injected, BindingPtr, InjectorPtr injector) const
Inject an Iface.
Definition: method_binding.h:121
The base class of all actual binding implementations.
Definition: binding.h:22
Definition: method_binding.h:47
Definition: method_binding.h:68
Definition: method_binding.h:14
A complete specification of a dependency request.
Definition: key.h:15
Definition: apply_variadic.h:34