Home | History | Annotate | Download | only in fruit
      1 /*
      2  * Copyright 2014 Google Inc. All rights reserved.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef FRUIT_COMPONENT_H
     18 #define FRUIT_COMPONENT_H
     19 
     20 // This include is not required here, but having it here shortens the include trace in error messages.
     21 #include <fruit/impl/injection_errors.h>
     22 
     23 #include <fruit/fruit_forward_decls.h>
     24 #include <fruit/impl/bindings.h>
     25 #include <fruit/impl/component_functors.defn.h>
     26 #include <fruit/impl/component_storage/component_storage.h>
     27 #include <fruit/impl/component_storage/partial_component_storage.h>
     28 #include <fruit/impl/meta/component.h>
     29 
     30 namespace fruit {
     31 
     32 /**
     33  * A component (aka module) represents a collection of bindings.
     34  * You can think of a Component object as a UML component.
     35  *
     36  * The parameters can be of the form <P...> or <Required<R...>, P...> where:
     37  * * R... are the required types (types required to inject some types in P... but that are not provided by this
     38  *   Component), if any
     39  * * P... are the types provided by this Component.
     40  * No type can appear twice, not even once in R and once in P.
     41  *
     42  * See PartialComponent below for how to construct a Component.
     43  */
     44 template <typename... Params>
     45 class Component {
     46 public:
     47   Component(Component&&) = default;
     48 
     49   Component& operator=(Component&&) = delete;
     50   Component& operator=(const Component&) = delete;
     51 
     52   /**
     53    * Converts a PartialComponent to an arbitrary Component, auto-injecting the missing types (if
     54    * any).
     55    * This is usually called implicitly when returning a component from a function. See PartialComponent for an example.
     56    */
     57   template <typename... Bindings>
     58   Component(PartialComponent<Bindings...>&& component);
     59 
     60 private:
     61   // Do not use. Use fruit::createComponent() instead.
     62   Component() = default;
     63 
     64   template <typename... Types>
     65   friend class Component;
     66 
     67   template <typename... Bindings>
     68   friend class PartialComponent;
     69 
     70   template <typename... OtherParams>
     71   friend class NormalizedComponent;
     72 
     73   template <typename... OtherParams>
     74   friend class Injector;
     75 
     76   template <typename... Bindings>
     77   friend class fruit::impl::PartialComponentStorage;
     78 
     79   template <typename Component, typename... Args>
     80   friend class fruit::impl::LazyComponentImpl;
     81 
     82   friend struct fruit::impl::ComponentStorageEntry::LazyComponentWithNoArgs;
     83 
     84   template <typename Component, typename... Args>
     85   friend class fruit::impl::ComponentInterfaceImpl;
     86 
     87   fruit::impl::ComponentStorage storage;
     88 
     89   using Comp = fruit::impl::meta::Eval<fruit::impl::meta::ConstructComponentImpl(fruit::impl::meta::Type<Params>...)>;
     90 
     91   using Check1 = typename fruit::impl::meta::CheckIfError<Comp>::type;
     92   // Force instantiation of Check1.
     93   static_assert(true || sizeof(Check1), "");
     94 };
     95 
     96 /**
     97  * Constructs an empty component.
     98  *
     99  * Example usage:
    100  *
    101  * fruit::Component<Foo> getFooComponent() {
    102  *   return fruit::createComponent()
    103  *      .install(getComponent1)
    104  *      .install(getComponent2)
    105  *      .bind<Foo, FooImpl>();
    106  * }
    107  *
    108  * Since types are auto-injected when needed, just converting this to the desired component can suffice in some cases,
    109  * e.g.:
    110  *
    111  * fruit::Component<Foo> getFooComponent() {
    112  *   return fruit::createComponent();
    113  * }
    114  *
    115  * That works if Foo has an Inject typedef or a constructor wrapped in INJECT.
    116  */
    117 PartialComponent<> createComponent();
    118 
    119 /**
    120  * A partially constructed component.
    121  *
    122  * Client code should never write `PartialComponent'; always start the construction of a component with
    123  * fruit::createComponent(), and end it by casting the PartialComponent to the desired Component (often done implicitly
    124  * by returning a PartialComponent from a function that has Component<...> as the return type).
    125  *
    126  * The template parameter is used to propagate information about bound types, it is purely an implementation detail;
    127  * users of the Fruit library can pretend that this class is not templated, in no case a specific template parameter is
    128  * required. All methods of this class return a PartialComponent, which allows to chain method invocations without
    129  * declaring a variable of type PartialComponent.
    130  *
    131  * Example usage:
    132  *
    133  * fruit::Component<Foo> getFooComponent() {
    134  *   return fruit::createComponent()
    135  *      .install(getComponent1)
    136  *      .install(getComponent2)
    137  *      .bind<Foo, FooImpl>();
    138  * }
    139  *
    140  * Note that no variable of type PartialComponent has been declared; this class should only be used for temporary
    141  * values.
    142  */
    143 template <typename... Bindings>
    144 class PartialComponent {
    145 public:
    146   PartialComponent& operator=(PartialComponent&&) = delete;
    147   PartialComponent& operator=(const PartialComponent&) = delete;
    148 
    149   /**
    150    * This tells Fruit that "the implementation of I is C".
    151    * I must be a base class of C, and it's typically (but not necessarily) an abstract class.
    152    * C is typically a concrete class, but it doesn't have to be: for example, if A inherits from B and B inherits from C
    153    * you can specify bind<C, B>() and bind<B, A>().
    154    *
    155    * The most common use of this is to bind the type I to the type C, for example:
    156    *
    157    * class MyInterface {
    158    * public:
    159    *   virtual void foo() = 0;
    160    * };
    161    *
    162    * class MyImplementation {
    163    * public:
    164    *   INJECT(MyImplementation()) {}
    165    *
    166    *   void foo() {
    167    *     ...
    168    *   }
    169    * };
    170    *
    171    * fruit::Component<MyInterface> getMyInterfaceComponent() {
    172    *   return fruit::createComponent()
    173    *      .bind<MyInterface, MyImplementation>();
    174    * }
    175    *
    176    * The implementation class can be bound in any way, it doesn't need to be bound using constructor injection as above
    177    * (although that's a very common use case).
    178    *
    179    * You can bind an interface to a type bound using a constant binding (see the bindInstance method that takes a const&
    180    * for more details), however the interface will then also be considered bound with a constant binding, and you must
    181    * declare that in the returned Component's type. For example:
    182    *
    183    * fruit::Component<const MyInterface> getMyInterfaceComponent() {
    184    *   static const MyImplementation my_implementation = MyImplementation();
    185    *   return fruit::createComponent()
    186    *      .bindInstance(my_implementation)
    187    *      .bind<MyInterface, MyImplementation>();
    188    * }
    189    *
    190    * In addition to binding the type I to the type C, a `bind()` can also be used to bind a
    191    * std::function<std::unique_ptr<I>(Args...)> to a std::function<std::unique_ptr<C>(Args...)> or a
    192    * std::function<C(Args...)>. For example:
    193    *
    194    * fruit::Component<std::function<std::unique_ptr<MyInterface>(int)>> getIFactoryComponent() {
    195    *   static const std::function<MyImplementation(int)> cFactory = [](int n) { return MyImplementation(n); };
    196    *   return fruit::createComponent()
    197    *       .bind<MyInterface, MyImplementation>()
    198    *       .bindInstance(cFactory);
    199    * }
    200    *
    201    * Or alternatively you can do the same using constructor injection:
    202    *
    203    * class MyImplementation {
    204    * public:
    205    *   INJECT(MyImplementation(ASSISTED(int) n))
    206    *     : n(n) {
    207    *   }
    208    *   ...
    209    * };
    210    *
    211    * fruit::Component<std::function<std::unique_ptr<MyInterface>(int)>> getIFactoryComponent() {
    212    *   return fruit::createComponent()
    213    *       .bind<MyInterface, MyImplementation>();
    214    * }
    215    *
    216    * Fruit determines the actual binding(s) to generate based on the types you declare as provided in the returned
    217    * Component<> type (e.g. in the last example std::function<std::unique_ptr<MyInterface>(int)> is declared as provided
    218    * so Fruit will generate a factory binding instead of a normal MyInterface->MyImplementation binding.
    219    *
    220    * Fruit can also detect types that are needed for constructor/provider/factory bindings, and it will then use that
    221    * information to determine the desired binding. For example:
    222    *
    223    * class MyImplementation {
    224    * public:
    225    *   INJECT(MyImplementation(ASSISTED(int) n))
    226    *     : n(n) {
    227    *   }
    228    *   ...
    229    * };
    230    *
    231    * class Foo {
    232    * private:
    233    *   std::function<std::unique_ptr<MyInterface>(int)> factory;
    234    * public:
    235    *   INJECT(Foo(std::function<std::unique_ptr<MyInterface>(int)> factory))
    236    *     : factory(factory) {
    237    *   }
    238    * };
    239    *
    240    * fruit::Component<Foo> getIFactoryComponent() {
    241    *   return fruit::createComponent()
    242    *       // We want to bind Foo, which requires std::function<std::unique_ptr<MyInterface>(int)>.
    243    *       // So std::function<std::unique_ptr<MyInterface>(int)> will be bound to
    244    *       // std::function<std::unique_ptr<MyImplementation>(int)>, and that will be bound using constructor injection.
    245    *       .bind<MyInterface, MyImplementation>();
    246    * }
    247    *
    248    * All these cases support annotated injection, just wrap I and/or C in fruit::Annotated<> if desired. For example:
    249    *
    250    * struct MyAnnotation{};
    251    *
    252    * fruit::Component<fruit::Annotated<MyAnnotation, MyInterface>> getMyInterfaceComponent() {
    253    *   return fruit::createComponent()
    254    *      .bind<fruit::Annotated<MyAnnotation, MyInterface>, MyImplementation>();
    255    * }
    256    */
    257   template <typename I, typename C>
    258   PartialComponent<fruit::impl::Bind<I, C>, Bindings...> bind();
    259 
    260   /**
    261    * Registers Signature as the constructor signature to use to inject a type.
    262    *
    263    * Example usage:
    264    *
    265    * fruit::createComponent()
    266    *     .registerConstructor<Foo(Bar*,Baz*)>() // Registers the constructor Foo::Foo(Bar*,Baz*)
    267    *
    268    * It's usually more convenient to use an INJECT macro or Inject typedef instead, e.g.:
    269    *
    270    * class Foo {
    271    * public:
    272    *   // This also declares the constructor
    273    *   INJECT(Foo(Bar* bar, Baz* baz));
    274    * ...
    275    * };
    276    *
    277    * or (equivalent):
    278    *
    279    * class Foo {
    280    * public:
    281    *   using Inject = Foo(Bar*, Baz*);
    282    *   Foo(Bar* bar, Baz* baz);
    283    * ...
    284    * };
    285    *
    286    * Use registerConstructor() when you want to inject the class C in different ways in different components (just make
    287    * sure those don't end up in the same injector, or use annotated injection to prevent the bindings from clashing),
    288    * or when C is a third-party class that can't be modified.
    289    *
    290    * This supports annotated injection, just wrap the desired types (return type and/or argument types of the signature)
    291    * with fruit::Annotated<> if desired. For example:
    292    *
    293    * struct Annotation1 {};
    294    * struct Annotation2 {};
    295    *
    296    * struct Foo {
    297    *   Foo(Bar* bar) {...}
    298    * };
    299    *
    300    * fruit::Component<fruit::Annotated<Annotation1, Bar>> getBarComponent() {...}
    301    *
    302    * fruit::Component<fruit::Annotated<Annotation2, Foo>> getFooComponent() {
    303    *   return fruit::createComponent()
    304    *       .install(getBarComponent)
    305    *       .registerConstructor<fruit::Annotated<Annotation2, Foo>(fruit::Annotated<Annotation1, Bar*>)>();
    306    * }
    307    *
    308    * This does *not* support assisted injection, for that you should use registerFactory() instead.
    309    *
    310    * The allowed argument types in the signature are, for any class (or fundamental) type C:
    311    *
    312    * C
    313    * C*
    314    * C&
    315    * const C*
    316    * const C&
    317    * shared_ptr<C>
    318    * Provider<C>
    319    * Provider<const C>
    320    * Annotated<Annotation, C>                   (for any type `Annotation')
    321    * Annotated<Annotation, C*>                  (for any type `Annotation')
    322    * Annotated<Annotation, C&>                  (for any type `Annotation')
    323    * Annotated<Annotation, const C*>            (for any type `Annotation')
    324    * Annotated<Annotation, const C&>            (for any type `Annotation')
    325    * Annotated<Annotation, shared_ptr<C>>       (for any type `Annotation')
    326    * Annotated<Annotation, Provider<C>>         (for any type `Annotation')
    327    * Annotated<Annotation, Provider<const C>>   (for any type `Annotation')
    328    */
    329   template <typename Signature>
    330   PartialComponent<fruit::impl::RegisterConstructor<Signature>, Bindings...> registerConstructor();
    331 
    332   /**
    333    * Use this method to bind the type C to a specific instance.
    334    * The caller must ensure that the provided reference is valid for the entire lifetime of the component and of any
    335    * components or injectors that install this component; the caller must also ensure that the object is destroyed after
    336    * the last components/injectors using it are destroyed.
    337    *
    338    * Example usage:
    339    *
    340    * Component<Request> getRequestComponent(Request* request) {
    341    *   return fruit::createComponent()
    342    *       .bindInstance(*request);
    343    * }
    344    *
    345    * NormalizedComponent<...> normalizedComponent = ...;
    346    * Request request;
    347    * Injector<...> injector(normalizedComponent,
    348    *                        getRequestComponent,
    349    *                        request));
    350    *
    351    * This should be used sparingly (you should let Fruit handle the object lifetime when possible), but in some cases it
    352    * is necessary; for example, if a web server creates an injector to handle each request, this method can be used to
    353    * inject the request itself as in the example above (see the Server page in the Fruit tutorial for more details).
    354    *
    355    * It's also possible to bind constants, see the documentation of the bindInstance() method taking a const& for
    356    * details.
    357    */
    358   template <typename C>
    359   PartialComponent<fruit::impl::BindInstance<C, C>, Bindings...> bindInstance(C& instance);
    360 
    361   /**
    362    * Similar to the previous, but binds a const&. Note that the reference must still outlive the component/injector
    363    * as in the non-const case.
    364    * When using this method, you must declare that the type is constant in the Component type. For example:
    365    *
    366    * Component<const MyExpensiveClass> getMyExpensiveClassComponent() {
    367    *   static const MyExpensiveClass my_expensive_class = createMyExpensiveClass();
    368    *   return fruit::createComponent()
    369    *       .bindInstance(my_expensive_class);
    370    * }
    371    *
    372    * Constant bindings can be used as other bindings, except that you can only inject the constant type (e.g. as a
    373    * constructor parameter) as:
    374    *
    375    * C
    376    * const C*
    377    * const C&
    378    * Provider<const C>
    379    * Annotated<Annotation, C>                   (for any type `Annotation')
    380    * Annotated<Annotation, const C*>            (for any type `Annotation')
    381    * Annotated<Annotation, const C&>            (for any type `Annotation')
    382    * Annotated<Annotation, Provider<const C>>   (for any type `Annotation')
    383    *
    384    * While you can't inject it as:
    385    *
    386    * C*
    387    * C&
    388    * shared_ptr<C>
    389    * Provider<C>
    390    * Annotated<Annotation, C*>                  (for any type `Annotation')
    391    * Annotated<Annotation, C&>                  (for any type `Annotation')
    392    * Annotated<Annotation, shared_ptr<C>>       (for any type `Annotation')
    393    * Annotated<Annotation, Provider<C>>         (for any type `Annotation')
    394    */
    395   template <typename C>
    396   PartialComponent<fruit::impl::BindConstInstance<C, C>, Bindings...> bindInstance(const C& instance);
    397 
    398   /**
    399    * This is deleted to catch cases where the instance would likely be destroyed before the component/injectors.
    400    */
    401   template <typename C>
    402   PartialComponent<fruit::impl::BindConstInstance<C, C>, Bindings...> bindInstance(C&&) = delete;
    403 
    404   /**
    405    * Similar to the first version of bindInstance(), but allows to specify an annotated type that
    406    * will be bound to the specified value.
    407    * For example, to bind an instance to the type fruit::Annotated<Hostname, std::string>, you can use:
    408    *
    409    * fruit::Component<fruit::Annotated<Hostname, std::string>> getHostnameComponent(std::string* hostname) {
    410    *   fruit::createComponent()
    411    *       .bindInstance<fruit::Annotated<Hostname, std::string>>(*hostname);
    412    * }
    413    */
    414   template <typename AnnotatedType, typename C>
    415   PartialComponent<fruit::impl::BindInstance<AnnotatedType, C>, Bindings...> bindInstance(C& instance);
    416 
    417   /**
    418    * Similar to the previous, but binds a const&. Example usage:
    419    *
    420    * fruit::Component<fruit::Annotated<Hostname, const std::string>> getHostnameComponent() {
    421    *   static const std::string hostname = determineHostname();
    422    *   fruit::createComponent()
    423    *       .bindInstance<fruit::Annotated<Hostname, std::string>>(hostname);
    424    * }
    425    *
    426    * See the documentation for the bindInstance() overload that takes a non-annotated const& for more details.
    427    */
    428   template <typename AnnotatedType, typename C>
    429   PartialComponent<fruit::impl::BindConstInstance<AnnotatedType, C>, Bindings...> bindInstance(const C& instance);
    430 
    431   /**
    432    * This is deleted to catch cases where the instance would likely be destroyed before the component/injectors.
    433    */
    434   template <typename AnnotatedType, typename C>
    435   PartialComponent<fruit::impl::BindConstInstance<AnnotatedType, C>, Bindings...> bindInstance(C&& instance);
    436 
    437   /**
    438    * Registers `provider' as a provider of C, where provider is a lambda with no captures returning either C or C*
    439    * (prefer returning a C by value instead of allocating a C using `new C', to avoid the allocation).
    440    *
    441    * When injecting a C, the arguments of the provider will be injected and the provider will then be called to create
    442    * the C instance, that will then be stored in the injector.
    443    *
    444    * If `provider' returns a pointer, it must be non-null; otherwise the program will abort.
    445    *
    446    * Example:
    447    *
    448    * fruit::Component<Foo> getFooComponent() {
    449    *   return fruit::createComponent()
    450    *       .install(getBarComponent)
    451    *       .install(getBazComponent)
    452    *       .registerProvider([](Bar* bar, Baz* baz) {
    453    *          Foo foo(bar, baz);
    454    *          foo.initialize();
    455    *          return foo;
    456    *       });
    457    * }
    458    *
    459    * As in the previous example, it's not necessary to specify the type parameter, it will be inferred by the compiler.
    460    *
    461    * registerProvider() can't be called with a plain function, but you can write a lambda that wraps the function to
    462    * achieve the same result.
    463    *
    464    * Registering stateful functors (including lambdas with captures) is NOT supported.
    465    * However, you can write something like:
    466    *
    467    * struct Functor {
    468    *   Functor(int n) {...}
    469    *   MyClass operator()(Foo* foo) const {...}
    470    * };
    471    *
    472    * Component<MyClass> getMyClassComponent() {
    473    *   static const Functor aFunctor(42);
    474    *   return fruit::createComponent()
    475    *       .install(getFooComponent)
    476    *       .bindInstance(aFunctor)
    477    *       .registerProvider([](const Functor& functor, Foo* foo) { return functor(foo); });
    478    * }
    479    */
    480   template <typename Lambda>
    481   PartialComponent<fruit::impl::RegisterProvider<Lambda>, Bindings...> registerProvider(Lambda lambda);
    482 
    483   /**
    484    * Similar to the previous version of registerProvider(), but allows to specify an annotated type
    485    * for the provider. This allows to inject annotated types in the parameters and/or bind the
    486    * provider to an annotated type. For example:
    487    *
    488    * struct MyAnnotation1 {};
    489    * struct MyAnnotation2 {};
    490    *
    491    * Component<fruit::Annotated<Annotation1, Bar>> getBarComponent() {...}
    492    * Component<Baz> getBazComponent() {...}
    493    *
    494    * fruit::Component<fruit::Annotated<Annotation2, Foo>> getFooComponent() {
    495    *   return fruit::createComponent()
    496    *       .install(getBarComponent)
    497    *       .install(getBazComponent)
    498    *       .registerProvider<
    499    *           fruit::Annotated<Annotation2, Foo>(
    500    *               fruit::Annotated<Annotation1, Bar*>,
    501    *               Baz*)
    502    *           >([](Bar* bar, Baz* baz) {
    503    *              Foo foo(bar, baz);
    504    *              foo.initialize();
    505    *              return foo;
    506    *           });
    507    * }
    508    */
    509   template <typename AnnotatedSignature, typename Lambda>
    510   PartialComponent<fruit::impl::RegisterProvider<AnnotatedSignature, Lambda>, Bindings...>
    511   registerProvider(Lambda lambda);
    512 
    513   /**
    514    * Similar to bind<I, C>(), but adds a multibinding instead.
    515    *
    516    * Multibindings are independent from bindings; creating a binding with bind doesn't count as a multibinding, and
    517    * adding a multibinding doesn't allow to inject the type (it only allows to retrieve multibindings through the
    518    * getMultibindings method of the injector).
    519    *
    520    * Unlike bindings, where adding a the same binding twice is allowed (and ignored), adding the same multibinding
    521    * multiple times will result in the creation of multiple "equivalent" instances, that will all be returned by
    522    * getMultibindings().
    523    *
    524    * Another difference compared with normal bindings is that this can't be used to bind  a
    525    * std::function<std::unique_ptr<I>(Args...)> to a std::function<std::unique_ptr<C>(Args...)> or a
    526    * std::function<C(Args...)>.
    527    *
    528    * As bind(), this supports annotated injection, just wrap I and/or C in fruit::Annotated<> if desired. See the
    529    * documentation of bind() for more details.
    530    */
    531   template <typename I, typename C>
    532   PartialComponent<fruit::impl::AddMultibinding<I, C>, Bindings...> addMultibinding();
    533 
    534   /**
    535    * Similar to bindInstance(), but adds a multibinding instead.
    536    *
    537    * Multibindings are independent from bindings; creating a binding with bindInstance doesn't count as a
    538    * multibinding, and adding a multibinding doesn't allow to inject the type (it only allows to retrieve
    539    * multibindings through the getMultibindings method of the injector).
    540    *
    541    * Unlike bindings, where adding a the same binding twice is allowed (and ignored), adding several multibindings for
    542    * the same instance will result in duplicated values in the result of getMultibindings.
    543    *
    544    * Another difference compared to bindInstance() is that you can't use this to bind a const& (note that there is no
    545    * overload of this method that takes a const&).
    546    *
    547    * This method adds a multibinding for C. If the object implements an interface I and you want to add a multibinding
    548    * for that interface instead, you must cast the object to I& before passing it to this method.
    549    *
    550    * Note that this takes the instance by reference, not by value; it must remain valid for the entire lifetime of this
    551    * component and of any injectors created from this component.
    552    *
    553    * Example use:
    554    *
    555    * class MyClass {
    556    *   ...
    557    * };
    558    *
    559    * fruit::Component<> getMyComponent() {
    560    *   static MyClass x = MyClass(...);
    561    *   static MyClass y = MyClass(...);
    562    *   return fruit::createComponent()
    563    *       .addInstanceMultibinding(x)
    564    *       .addInstanceMultibinding(y);
    565    * }
    566    *
    567    * fruit::Injector<> injector(getMyComponent);
    568    * // This vector contains {&x, &y}.
    569    * const std::vector<MyClass*>& objects = injector.getMultibindings<MyClass>();
    570    */
    571   template <typename C>
    572   PartialComponent<fruit::impl::AddInstanceMultibinding<C>, Bindings...> addInstanceMultibinding(C& instance);
    573 
    574   /**
    575    * Similar to the previous version of addInstanceMultibinding(), but allows to specify an
    576    * annotated type.
    577    * Example use:
    578    *
    579    * struct MyAnnotation {};
    580    *
    581    * class MyClass {
    582    *   ...
    583    * };
    584    *
    585    * fruit::Component<> getMyComponent() {
    586    *   static MyClass x = MyClass(...);
    587    *   static MyClass y = MyClass(...);
    588    *   return fruit::createComponent()
    589    *       .addInstanceMultibinding<fruit::Annotated<MyAnnotation, MyClass>>(x)
    590    *       .addInstanceMultibinding<fruit::Annotated<MyAnnotation, MyClass>>(y);
    591    * }
    592    *
    593    * fruit::Injector<> injector(getMyComponent);
    594    * // This vector contains {&x, &y}.
    595    * const std::vector<MyClass*>& objects = injector.getMultibindings<fruit::Annotated<MyAnnotation, MyClass>>();
    596    */
    597   template <typename AnnotatedC, typename C>
    598   PartialComponent<fruit::impl::AddInstanceMultibinding<AnnotatedC>, Bindings...> addInstanceMultibinding(C& instance);
    599 
    600   /**
    601    * Equivalent to calling addInstanceMultibinding() for each elements of `instances'.
    602    * See the documentation of addInstanceMultibinding() for more details.
    603    *
    604    * Note that this takes the vector by reference, not by value; the vector (and its elements) must remain valid for the
    605    * entire lifetime of this component and of any injectors created from this component.
    606    *
    607    * Example use:
    608    *
    609    * class MyClass {
    610    *   ...
    611    * };
    612    *
    613    * fruit::Component<> getMyComponent() {
    614    *   static MyClass x = MyClass(...);
    615    *   static std::vector<MyClass> other_objects{MyClass(...), MyClass(...)};
    616    *   return fruit::createComponent()
    617    *       .addInstanceMultibinding(x)
    618    *       .addInstanceMultibindings(other_objects);
    619    * }
    620    *
    621    * fruit::Injector<> injector(getMyComponent);
    622    * // This vector contains {&x, &(other_objects[0]), &(other_objects[1])}.
    623    * const std::vector<MyClass*>& objects = injector.getMultibindings<MyClass>();
    624    */
    625   template <typename C>
    626   PartialComponent<fruit::impl::AddInstanceVectorMultibindings<C>, Bindings...>
    627   addInstanceMultibindings(std::vector<C>& instances);
    628 
    629   /**
    630    * Similar to the previous version of addInstanceMultibindings(), but it allows to specify an annotated type.
    631    *
    632    * Example use:
    633    *
    634    * class MyClass {
    635    *   ...
    636    * };
    637    *
    638    * fruit::Component<> getMyComponent() {
    639    *   static MyClass x = MyClass(...);
    640    *   static std::vector<MyClass> other_objects{MyClass(...), MyClass(...)};
    641    *   return fruit::createComponent()
    642    *       .addInstanceMultibinding<fruit::Annotated<MyAnnotation, MyClass>>(x)
    643    *       .addInstanceMultibindings<fruit::Annotated<MyAnnotation, MyClass>>(other_objects);
    644    * }
    645    *
    646    * fruit::Injector<> injector(getMyComponent);
    647    * // This vector contains {&x, &(other_objects[0]), &(other_objects[1])}.
    648    * const std::vector<MyClass*>& objects = injector.getMultibindings<fruit::Annotated<MyAnnotation, MyClass>>();
    649    */
    650   template <typename AnnotatedC, typename C>
    651   PartialComponent<fruit::impl::AddInstanceVectorMultibindings<AnnotatedC>, Bindings...>
    652   addInstanceMultibindings(std::vector<C>& instances);
    653 
    654   /**
    655    * Similar to registerProvider, but adds a multibinding instead.
    656    *
    657    * Multibindings are independent from bindings; creating a binding with registerProvider doesn't count as a
    658    * multibinding, and adding a multibinding doesn't allow to inject the type (it only allows to retrieve multibindings
    659    * through the getMultibindings method of the injector).
    660    *
    661    * Unlike bindings, where adding a the same binding twice is allowed (and ignored), adding the same multibinding
    662    * provider multiple times will result in the creation of multiple "equivalent" instances, that will all be returned
    663    * by getMultibindings.
    664    * It is good practice to add the multibindings in a component that is "close" to the injector in the get*Component
    665    * call chain, to avoid adding the same multibinding more than once.
    666    *
    667    * Example use:
    668    *
    669    * class MyClass {
    670    * public:
    671    *   MyClass(int n) {...}
    672    * };
    673    *
    674    * fruit::Component<> getMyComponent() {
    675    *   return fruit::createComponent()
    676    *       .addMultibindingProvider([]() { return MyClass(10); })
    677    *       .addMultibindingProvider([]() { return MyClass(10); })
    678    *       .addMultibindingProvider([]() { return MyClass(20); });
    679    * }
    680    *
    681    * fruit::Injector<> injector(getMyComponent);
    682    * // This vector contains {&x, &y, &z} where x and y are MyClass objects constructed with 10 and z is a MyClass
    683    * // object constructed with 20.
    684    * const std::vector<MyClass*>& objects = injector.getMultibindings<MyClass>();
    685    *
    686    * Note that this method adds a multibinding for the type returned by the provider. If the returned object implements
    687    * an interface I and you want to add a multibinding for that interface instead, you should cast the pointer to I*
    688    * before returning it.
    689    */
    690   template <typename Lambda>
    691   PartialComponent<fruit::impl::AddMultibindingProvider<Lambda>, Bindings...> addMultibindingProvider(Lambda lambda);
    692 
    693   /**
    694    * Similar to the previous version of addMultibindingProvider(), but allows to specify an annotated type
    695    * for the provider. This allows to inject annotated types in the parameters and/or bind the
    696    * provider to an annotated type.
    697    *
    698    * Example use:
    699    *
    700    * struct MyAnnotation1 {};
    701    * struct MyAnnotation2 {};
    702    *
    703    * Component<fruit::Annotated<Annotation1, Bar>> getBarComponent() {...}
    704    * Component<Baz> getBazComponent() {...}
    705    *
    706    * fruit::Component<> getFooComponent() {
    707    *   return fruit::createComponent()
    708    *       .install(getBarComponent)
    709    *       .install(getBazComponent)
    710    *       .registerMultibindingProvider<
    711    *           fruit::Annotated<Annotation2, Foo>(
    712    *               fruit::Annotated<Annotation1, Bar*>,
    713    *               Baz*)
    714    *           >([](Bar* bar, Baz* baz) {
    715    *              Foo foo(bar, baz);
    716    *              foo.initialize();
    717    *              return foo;
    718    *           });
    719    * }
    720    *
    721    *
    722    * fruit::Injector<> injector(getFooComponent);
    723    * // This vector contains {&x} where x is an instance of Foo constructed using the lambda above, with injected
    724    * // instances of Bar and Baz.
    725    * const std::vector<MyClass*>& objects = injector.getMultibindings<fruit::Annotated<Annotation2, Foo>>();
    726    */
    727   template <typename AnnotatedSignature, typename Lambda>
    728   PartialComponent<fruit::impl::AddMultibindingProvider<AnnotatedSignature, Lambda>, Bindings...>
    729   addMultibindingProvider(Lambda lambda);
    730 
    731   /**
    732    * Registers `factory' as a factory of C, where `factory' is a lambda with no captures returning C.
    733    * This is typically used for assisted injection (but it can also be used if no parameters are assisted).
    734    *
    735    * C can be any class (or fundamental) type. If C is std::unique_ptr<T>, the factory together with a bind<I,C> in the
    736    * same component will automatically bind the corresponding std::function that returns a std::unique_ptr<I>.
    737    * See the documentation of bind() for more details.
    738    *
    739    * The returned type can't be a pointer type. If you don't want to return it by value, you should return a
    740    * std::unique_ptr instead.
    741    *
    742    * Example:
    743    *
    744    * Component<std::function<std::unique_ptr<MyClass>(int)>> getMyClassComponent() {
    745    *   fruit::createComponent()
    746    *       .install(getFooComponent)
    747    *       .registerFactory<std::unique_ptr<MyClass>(Foo*, fruit::Assisted<int>)>(
    748    *          [](Foo* foo, int n) {
    749    *              return std::unique_ptr<MyClass>(new MyClass(foo, n));
    750    *          });
    751    * }
    752    *
    753    * Injector<std::function<std::unique_ptr<MyClass>(int)>> injector(getMyClassComponent);
    754    *
    755    * std::function<std::unique_ptr<MyClass>(int)> factory(injector);
    756    * std::unique_ptr<MyClass> x = factory(42);
    757    *
    758    * The parameters marked as Assisted will become parameters of the std::function (in the same order), while the others
    759    * (e.g. Foo in the example above) will be injected.
    760    *
    761    * Unlike registerProvider(), where the signature is inferred, for this method the signature (including any Assisted
    762    * annotations) must be specified explicitly, while the second template parameter is inferred.
    763    *
    764    * If the only thing that the factory does is to call new and the constructor of the class, it's usually more
    765    * convenient to use an Inject typedef or INJECT macro instead, e.g. the following are equivalent to the above:
    766    *
    767    * class MyClass {
    768    * public:
    769    *    using Inject = MyClass(Foo*, Assisted<int>);
    770    *
    771    *    MyClass(Foo* foo, int n) {...}
    772    * };
    773    *
    774    * or:
    775    *
    776    * class MyClass {
    777    * public:
    778    *    INJECT(MyClass(Foo* foo, ASSISTED(int) n)) {...}
    779    * };
    780    *
    781    * Use registerFactory() when you want to inject the class in different ways in different components (just make sure
    782    * those don't end up in the same injector), or when MyClass is a third-party class that can't be modified.
    783    *
    784    * registerFactory() can't be called with a plain function, but you can write a lambda that wraps the function to
    785    * achieve the same result.
    786    *
    787    * Registering stateful functors (including lambdas with captures) is NOT supported.
    788    * However, you can write something like:
    789    *
    790    * struct Functor {
    791    *   Functor(float x) {...}
    792    *   std::unique_ptr<MyClass> operator()(Foo* foo, int n) {...}
    793    * };
    794    *
    795    * Component<std::function<std::unique_ptr<MyClass>(int)>> getMyClassComponent() {
    796    *   static const Functor aFunctor(42.0);
    797    *   return fruit::createComponent()
    798    *       ... // Bind Foo
    799    *       .bindInstance(aFunctor)
    800    *       .registerFactory<
    801    *           std::unique_ptr<MyClass>(
    802    *               Functor functor,
    803    *               Foo*,
    804    *               Assisted<int>)
    805    *           >([](Functor functor, Foo* foo, int n) {
    806    *               return functor(foo, n);
    807    *           });
    808    * }
    809    */
    810   template <typename DecoratedSignature, typename Factory>
    811   PartialComponent<fruit::impl::RegisterFactory<DecoratedSignature, Factory>, Bindings...>
    812   registerFactory(Factory factory);
    813 
    814   /**
    815    * Adds the bindings (and multibindings) in the Component obtained by calling fun(args...) to the current component.
    816    *
    817    * For example, these component functions:
    818    * fruit::Component<Foo> getComponent1();
    819    * fruit::Component<Bar> getComponent2(int n, std::string s);
    820    *
    821    * can be combined as:
    822    *
    823    * fruit::Component<Foo, Bar> getFooBarComponent() {
    824    *   return fruit::createComponent()
    825    *      .install(getComponent1)
    826    *      .install(getComponent2, 5, std::string("Hello"));
    827    * }
    828    *
    829    * If any `args` are provided, they must be:
    830    * - Copy-constructible
    831    * - Move-constructible
    832    * - Assignable
    833    * - Move-assignable
    834    * - Equality comparable (i.e., operator== must be defined for two values of that type)
    835    * - Hashable (i.e., std::hash must be defined for values of that type)
    836    *
    837    * Note that this only applies to `args`. E.g. in the example above `int` and `std::string` must satisfy this
    838    * requirement (and they do), but `Foo` and `Bar` don't need to.
    839    *
    840    * Args and FormalArgs (if any) must be the same types; or to be precise, each type in Args must be convertible into
    841    * the corresponding type in FormalArgs.
    842    *
    843    * A lambda with no captures can also be used as the first argument, for example:
    844    *
    845    * fruit::Component<Foo, Bar> getFooBarComponent() {
    846    *   return fruit::createComponent()
    847    *      .install([]() { return getComponent1(); })
    848    *      .install([](int n) { return getComponent2(n, std::string("Hello")); }, 5);
    849    * }
    850    *
    851    * These two install() calls are equivalent to the previous ones.
    852    *
    853    * As in the example, the template parameters for this method will be inferred by the compiler, it's not necessary to
    854    * specify them explicitly.
    855    *
    856    * Fruit automatically de-duplicates install() calls, so they're effectively memoized (within each injector).
    857    * For example, in this code:
    858    *
    859    * fruit::Component<Foo> getFooComponent() {...}
    860    *
    861    * fruit::Component<Bar> getBarComponent() {
    862    *   return fruit::createComponent()
    863    *       .install(getFooComponent)
    864    *       .bind<Bar, BarImpl>();
    865    * }
    866    *
    867    * fruit::Component<Baz> getBazComponent() {
    868    *   return fruit::createComponent()
    869    *       .install(getFooComponent)
    870    *       .bind<Baz, BazImpl>();
    871    * }
    872    *
    873    * fruit::Component<Bar, Baz> getBarBazComponent() {
    874    *   return fruit::createComponent()
    875    *       .install(getBarComponent)
    876    *       .install(getBazComponent);
    877    * }
    878    *
    879    * fruit::Injector<Bar, Baz> injector(getBarBazComponent);
    880    *
    881    *
    882    * getFooComponent() will only be called once.
    883    * For Component functions with arguments, only one call will be done for each set of arguments, but multiple calls
    884    * might be made if multiple sets of arguments are used.
    885    *
    886    * If you actually want a Component function to be called/installed multiple times (e.g. if it binds a multibinding
    887    * and you actually want multiple multibindings to be bound) you can add a dummy argument and specify different values
    888    * for that argument when installing the component.
    889    */
    890   template <typename... OtherComponentParams, typename... FormalArgs, typename... Args>
    891   PartialComponent<fruit::impl::InstallComponent<fruit::Component<OtherComponentParams...>(FormalArgs...)>, Bindings...>
    892   install(fruit::Component<OtherComponentParams...> (*)(FormalArgs...), Args&&... args);
    893 
    894   /**
    895    * Similar to install(), but allows to install a variable number of component functions instead of just 1. This
    896    * additional flexibility is sometimes useful in templated `get*Component` functions and for other advanced use-cases.
    897    *
    898    * To use this method, wrap each get*Component function with its args in a fruit::ComponentFunction<...> object (using
    899    * the helper function fruit::componentFunction), then pass all the fruit::ComponentFunction<...> objects (which can
    900    * potentially have different params) to this method.
    901    *
    902    * For example:
    903    *
    904    * fruit::Component<Foo, Bar> getBarBazComponent() {
    905    *   return fruit::createComponent()
    906    *       .installComponentFunctions(
    907    *           fruit::componentFunction(getFooComponent, a, b, c),
    908    *           fruit::componentFunction(getBarComponent, x, y));
    909    * }
    910    *
    911    * Is equivalent to:
    912    *
    913    * fruit::Component<Foo, Bar> getBarBazComponent() {
    914    *   return fruit::createComponent()
    915    *       .install(getFooComponent, a, b, c)
    916    *       .install(getBarComponent, x, y);
    917    * }
    918    *
    919    * This is a simple example to show the idea, however in a simple case like this it's easier to just use install().
    920    */
    921   template <typename... ComponentFunctions>
    922   PartialComponent<fruit::impl::InstallComponentFunctions<ComponentFunctions...>, Bindings...>
    923   installComponentFunctions(ComponentFunctions... componentFunctions);
    924 
    925   /**
    926    * This class is returned by PartialComponent::replace, see the documentation of that method for more information.
    927    */
    928   template <typename ReplacedComponent, typename... GetReplacedComponentFormalArgs>
    929   class PartialComponentWithReplacementInProgress {
    930   private:
    931     using storage_t = fruit::impl::PartialComponentStorage<
    932         fruit::impl::PartialReplaceComponent<ReplacedComponent(GetReplacedComponentFormalArgs...)>, Bindings...>;
    933 
    934   public:
    935     template <typename... FormalArgs, typename... Args>
    936     PartialComponent<fruit::impl::ReplaceComponent<ReplacedComponent(GetReplacedComponentFormalArgs...),
    937                                                    ReplacedComponent(FormalArgs...)>,
    938                      Bindings...>
    939     with(ReplacedComponent (*)(FormalArgs...), Args&&... args);
    940 
    941     PartialComponentWithReplacementInProgress(storage_t storage) : storage(storage) {}
    942 
    943   private:
    944     storage_t storage;
    945 
    946     PartialComponentWithReplacementInProgress() = delete;
    947   };
    948 
    949   /**
    950    * This allows to replace an installed Component with another one. This is useful for testing.
    951    * For example, if you have these components:
    952    *
    953    * fruit::Component<MyDependency> getDependencyComponent() {...}
    954    *
    955    * fruit::Component<Foo> getFooComponent() {
    956    *     return fruit::createComponent()
    957    *         .install(getDependencyComponent)
    958    *         .bind<Foo, FooImpl>();
    959    * }
    960    *
    961    * fruit::Component<Bar> getBarComponent() {
    962    *     return fruit::createComponent()
    963    *         .install(getFooComponent)
    964    *         .bind<Bar, BarImpl>();
    965    * }
    966    *
    967    * When you test Bar, you might want to replace getDependencyComponent with a component that binds a fake
    968    * MyDependency:
    969    *
    970    * fruit::Component<MyDependency> getFakeDependencyComponent() {...}
    971    *
    972    * To do so, you can define a component like:
    973    *
    974    * fruit::Component<Bar> getBarComponentWithFakeDependency() {
    975    *     return fruit::createComponent()
    976    *         .replace(getDependencyComponent).with(getFakeDependencyComponent)
    977    *         .install(getBarComponent);
    978    * }
    979    *
    980    * This component is equivalent to:
    981    *
    982    * fruit::Component<Bar> getBarComponentWithFakeDependency() {
    983    *     return fruit::createComponent()
    984    *         .install(getFakeDependencyComponent)
    985    *         .bind<Foo, FooImpl>()
    986    *         .bind<Bar, BarImpl>();
    987    * }
    988    *
    989    * However this way you don't need to duplicate the bindings for Foo and Bar, and you don't even need to include them
    990    * in the translation unit (i.e., cc/cpp file) that defines getBarComponentWithFakeDependency().
    991    * In codebases with many layers, this can save a lot of duplication.
    992    *
    993    * Note that the .replace(...).with(...) must appear *before* installing the component to which it's applied to;
    994    * e.g., in the example above note how we install getBarComponent after the replacement in
    995    * getBarComponentWithFakeDependency.
    996    * If you add a replacement after the replaced component has been installed, Fruit will report an error at run-time.
    997    *
    998    * In the example above, the replaced and replacement component functions had no arguments, however it's also possible
    999    * to replace component functions with args. The arguments of the replaced and replacement component functions are
   1000    * independent; for example .replace(getDependencyComponentWithArgs, 15).with(myFakeComponentWithNoArgs) is allowed
   1001    * and it would replace all install(getDependencyComponentWithArgs, 15) calls with install(myFakeComponentWithNoArgs).
   1002    *
   1003    * The component types returned by the replaced and replacement components must be the same. For example, this is NOT
   1004    * allowed:
   1005    *
   1006    * fruit::Component<MyDependency, SomethingElse> getFakeDependencyComponentWithSomethingElse() {...}
   1007    *
   1008    * fruit::Component<Bar> getBarComponentWithFakeDependency() {
   1009    *     return fruit::createComponent()
   1010    *         .replace(getDependencyComponent).with(getFakeDependencyComponentWithSomethingElse) // error!
   1011    *         .install(getBarComponent);
   1012    * }
   1013    *
   1014    * But replacing a replaced component is allowed:
   1015    *
   1016    * fruit::Component<MyDependency> getOtherFakeDependencyComponent() {...}
   1017    *
   1018    * fruit::Component<Bar> getBarComponentWithOtherFakeDependency() {
   1019    *     return fruit::createComponent()
   1020    *         // The two replacements can appear in any order, but they must both be before the install().
   1021    *         .replace(getFakeDependencyComponent).with(getOtherFakeDependencyComponent)
   1022    *         .replace(getDependencyComponent).with(getFakeDependencyComponent)
   1023    *         .install(getBarComponent);
   1024    * }
   1025    *
   1026    * Of course this is a simple example, in the real world the replacements and the install would probably come from
   1027    * other components.
   1028    *
   1029    * And note that you can also replace components that define replacements, for example:
   1030    *
   1031    * fruit::Component<> getFakeDependencyReplacementComponent() {
   1032    *     return fruit::createComponent()
   1033    *         .replace(getDependencyComponent).with(getFakeDependencyComponentWithSomethingElse);
   1034    * }
   1035    *
   1036    * fruit::Component<...> getComponent() {
   1037    *     return fruit::createComponent()
   1038    *         .replace(getFakeDependencyReplacementComponent).with(...)
   1039    *         .install(...);
   1040    * }
   1041    *
   1042    * Replacements are only installed if the replaced component is installed, otherwise they are ignored.
   1043    * In the first example above, if getFooComponent didn't install getDependencyComponent, when a test creates an
   1044    * injector for getBarComponentWithFakeDependency it would not install getFakeDependencyComponent.
   1045    */
   1046   template <typename... OtherComponentParams, typename... FormalArgs, typename... Args>
   1047   typename PartialComponent<Bindings...>::template PartialComponentWithReplacementInProgress<
   1048       fruit::Component<OtherComponentParams...>, FormalArgs...>
   1049   replace(fruit::Component<OtherComponentParams...> (*)(FormalArgs...), Args&&... args);
   1050 
   1051   ~PartialComponent();
   1052 
   1053 private:
   1054   template <typename... OtherBindings>
   1055   friend class PartialComponent;
   1056 
   1057   template <typename... Types>
   1058   friend class Component;
   1059 
   1060   fruit::impl::PartialComponentStorage<Bindings...> storage;
   1061 
   1062   // Do not use. Use fruit::createComponent() instead.
   1063   PartialComponent() = delete;
   1064 
   1065   // Do not use. Only use PartialComponent for temporaries, and then convert it to a Component.
   1066   PartialComponent(const PartialComponent&) = delete;
   1067   PartialComponent(PartialComponent&&) = delete;
   1068 
   1069   PartialComponent(fruit::impl::PartialComponentStorage<Bindings...> storage);
   1070 
   1071   template <typename NewBinding>
   1072   using OpFor = typename fruit::impl::meta::OpForComponent<Bindings...>::template AddBinding<NewBinding>;
   1073 
   1074   friend PartialComponent<> createComponent();
   1075 };
   1076 
   1077 } // namespace fruit
   1078 
   1079 #include <fruit/impl/component.defn.h>
   1080 
   1081 #endif // FRUIT_COMPONENT_H
   1082