1*a65addddSAndroid Build Coastguard Worker 2*a65addddSAndroid Build Coastguard Worker #include <fruit/fruit.h> 3*a65addddSAndroid Build Coastguard Worker #include <iostream> 4*a65addddSAndroid Build Coastguard Worker 5*a65addddSAndroid Build Coastguard Worker using fruit::Component; 6*a65addddSAndroid Build Coastguard Worker using fruit::Injector; 7*a65addddSAndroid Build Coastguard Worker 8*a65addddSAndroid Build Coastguard Worker class Writer { 9*a65addddSAndroid Build Coastguard Worker public: 10*a65addddSAndroid Build Coastguard Worker virtual void write(std::string s) = 0; 11*a65addddSAndroid Build Coastguard Worker }; 12*a65addddSAndroid Build Coastguard Worker 13*a65addddSAndroid Build Coastguard Worker class StdoutWriter : public Writer { 14*a65addddSAndroid Build Coastguard Worker public: 15*a65addddSAndroid Build Coastguard Worker // Like "StdoutWriter() = default;" but also marks this constructor as the 16*a65addddSAndroid Build Coastguard Worker // one to use for injection. 17*a65addddSAndroid Build Coastguard Worker INJECT(StdoutWriter()) = default; 18*a65addddSAndroid Build Coastguard Worker write(std::string s)19*a65addddSAndroid Build Coastguard Worker virtual void write(std::string s) override { 20*a65addddSAndroid Build Coastguard Worker std::cout << s; 21*a65addddSAndroid Build Coastguard Worker } 22*a65addddSAndroid Build Coastguard Worker }; 23*a65addddSAndroid Build Coastguard Worker 24*a65addddSAndroid Build Coastguard Worker class Greeter { 25*a65addddSAndroid Build Coastguard Worker public: 26*a65addddSAndroid Build Coastguard Worker virtual void greet() = 0; 27*a65addddSAndroid Build Coastguard Worker }; 28*a65addddSAndroid Build Coastguard Worker 29*a65addddSAndroid Build Coastguard Worker class GreeterImpl : public Greeter { 30*a65addddSAndroid Build Coastguard Worker private: 31*a65addddSAndroid Build Coastguard Worker Writer* writer; 32*a65addddSAndroid Build Coastguard Worker 33*a65addddSAndroid Build Coastguard Worker public: 34*a65addddSAndroid Build Coastguard Worker // Like "GreeterImpl(Writer* writer) {...}" but also marks this constructor 35*a65addddSAndroid Build Coastguard Worker // as the one to use for injection. INJECT(GreeterImpl (Writer * writer))36*a65addddSAndroid Build Coastguard Worker INJECT(GreeterImpl(Writer* writer)) : writer(writer) {} 37*a65addddSAndroid Build Coastguard Worker greet()38*a65addddSAndroid Build Coastguard Worker virtual void greet() override { 39*a65addddSAndroid Build Coastguard Worker writer->write("Hello world!\n"); 40*a65addddSAndroid Build Coastguard Worker } 41*a65addddSAndroid Build Coastguard Worker }; 42*a65addddSAndroid Build Coastguard Worker getGreeterComponent()43*a65addddSAndroid Build Coastguard WorkerComponent<Greeter> getGreeterComponent() { 44*a65addddSAndroid Build Coastguard Worker return fruit::createComponent().bind<Writer, StdoutWriter>().bind<Greeter, GreeterImpl>(); 45*a65addddSAndroid Build Coastguard Worker } 46*a65addddSAndroid Build Coastguard Worker main()47*a65addddSAndroid Build Coastguard Workerint main() { 48*a65addddSAndroid Build Coastguard Worker 49*a65addddSAndroid Build Coastguard Worker Injector<Greeter> injector(getGreeterComponent); 50*a65addddSAndroid Build Coastguard Worker Greeter* greeter = injector.get<Greeter*>(); 51*a65addddSAndroid Build Coastguard Worker 52*a65addddSAndroid Build Coastguard Worker greeter->greet(); 53*a65addddSAndroid Build Coastguard Worker 54*a65addddSAndroid Build Coastguard Worker return 0; 55*a65addddSAndroid Build Coastguard Worker } 56