static VALUE ServiceModule_service_name(VALUE self, VALUE name) { struct Service *ruby_service; struct Client *ruby_client; Check_Type(name, T_STRING); rb_iv_set(self, "@ServiceName", name); ruby_service = make_service(StringValueCStr(name)); set_service(self, ruby_service); if(ircncmp(ruby_service->name, StringValueCStr(name), NICKLEN) != 0) rb_iv_set(self, "@ServiceName", rb_str_new2(ruby_service->name)); clear_serv_tree_parse(&ruby_service->msg_tree); dlinkAdd(ruby_service, &ruby_service->node, &services_list); hash_add_service(ruby_service); ruby_client = introduce_client(ruby_service->name, ruby_service->name, TRUE); rb_iv_set(self, "@client", client_to_value(ruby_client)); rb_iv_set(self, "@langpath", rb_str_new2(LANGPATH)); return name; }
service_container::service_ptr_t service_container::resolve_service_dependencies(string id) { logtrace << "service_container::resolve_service_dependencies('" << id << "')"; service_ptr_t service = this->services_.find(id); logtrace << " » found service: " << service->id() << ", got a " << service->get_service_definition_type_name(); if (service->was_visited()) return service; else if (service->is_resolving_in_progress()) return nullptr; // todo: throw ex. ? is this a cycle ? logtrace << " » resolving dependencies..."; service->set_resolving_in_progress(true); auto dependencies = service->get_dependencies_map(); logtrace << " » dependencies map contains " << dependencies.size() << " elements."; for (auto pair : dependencies) { auto depdecl = pair.second; logtrace << " - depends on service " << depdecl->get_service_id() << ", type: " << depdecl->get_service_type().pretty_name(); service_ptr_t serv = this->resolve_service_dependencies( depdecl->get_service_id() ); logtrace << " » " << service->id() << " : finished processing dep. : " << depdecl->get_service_id(); depdecl->set_service(serv); } logtrace << " » " << service->id() << " : end of dependencies resolution."; logtrace << " » " << service->id() << " : about to construct service."; service->construct(); logtrace << " » " << service->id() << " : construct() done."; service->set_resolving_in_progress(false); service->set_visited(true); return service; }