1 #ifndef SAUCE_CLAUSE_H_
2 #define SAUCE_CLAUSE_H_
7 #include <sauce/exceptions.h>
8 #include <sauce/memory.h>
9 #include <sauce/named.h>
10 #include <sauce/internal/bindings.h>
11 #include <sauce/internal/instance_binding.h>
12 #include <sauce/internal/method_binding.h>
13 #include <sauce/internal/new_binding.h>
14 #include <sauce/internal/opaque_binding.h>
15 #include <sauce/internal/pending_thrower.h>
16 #include <sauce/internal/provider_binding.h>
21 class ImplicitBindings;
29 OpaqueBindingPtr pendingBinding;
30 OpaqueBindingPtr providerBinding;
31 std::string dynamicName;
32 std::vector<std::string> dynamicDependencyNames;
38 pendingThrower(pendingThrower),
41 dynamicName(unnamed()),
42 dynamicDependencyNames() {
47 if (pendingBinding.get() == NULL) {
51 pendingBinding->setName(dynamicName);
52 pendingBinding->setDynamicDependencyNames(dynamicDependencyNames);
54 if (pendingBinding.get() != NULL) {
55 bindings.
put(pendingBinding);
58 if (providerBinding.get() != NULL) {
59 bindings.
put(providerBinding);
63 void bind(OpaqueBindingPtr pendingBinding) {
64 this->pendingBinding = pendingBinding;
67 void bindProvider(OpaqueBindingPtr providerBinding) {
68 this->providerBinding = providerBinding;
71 void setDynamicName(std::string
const name) {
72 this->dynamicName = name;
75 void bindDynamicDependencyName(
unsigned int position, std::string
const name) {
76 if (dynamicDependencyNames.size() <= position) {
77 dynamicDependencyNames.resize(position + 1, unnamed());
79 dynamicDependencyNames[position] = name;
82 template<
typename Exception>
84 pendingThrower.template throwLater<Exception>();
87 void clearException() {
88 pendingThrower.
clear();
92 typedef sauce::shared_ptr<ClauseState> ClauseStatePtr;
97 template<
typename Dependency>
103 virtual void onComplete() {
110 Clause(ClauseStatePtr state):
115 ClauseStatePtr getState() {
119 template<
typename Next>
120 Next pass(Next next) {
121 next.setState(state);
125 void setDynamicName(std::string
const name) {
126 state->setDynamicName(name);
129 template<
typename Exception>
131 state->template throwLater<Exception>();
134 void bindDynamicDependencyName(
unsigned int position, std::string
const name) {
135 state->bindDynamicDependencyName(position, name);
143 this->bindDynamicDependencyName(position, name);
147 void setState(ClauseStatePtr state) {
149 getState()->clearException();
156 namespace i = ::sauce::internal;
160 #endif // SAUCE_CLAUSE_H_
Thrown when a binding hasn't been completely specified for the given interface.
Definition: exceptions.h:49
PendingThrow clear()
Clear and return any saved exception.
Definition: pending_thrower.h:58
void throwAnyPending()
Throw and clear any saved exception.
Definition: pending_thrower.h:46
A container for bindings.
Definition: bindings.h:50
Base class for parts of the fluent binding API.
Definition: clause.h:98
Base class for all sauce exceptions.
Definition: exceptions.h:12
void put(OpaqueBindingPtr binding)
Insert the given binding.
Definition: bindings.h:70
The accumulated state passed between Clauses that ultimately results in a new Binding.
Definition: clause.h:26
A mixin to defer and throw pending exceptions.
Definition: pending_thrower.h:23