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>
13template<
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 {
40 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) {
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 {
70 InjectorPtr & injector;
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) {
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);
130namespace i = ::sauce::internal;
Definition: apply_variadic.h:34
The base class of all actual binding implementations.
Definition: binding.h:22
A complete specification of a dependency request.
Definition: key.h:15
Definition: method_binding.h:14
void inject(IfacePtr &injected, BindingPtr, InjectorPtr injector) const
Inject an Iface.
Definition: method_binding.h:121
Definition: method_binding.h:47
Definition: method_binding.h:38
Definition: method_binding.h:78
Definition: method_binding.h:68