package com.asayama.gwt.angular.client; import com.asayama.gwt.jsni.client.Closure; import com.asayama.gwt.jsni.client.Function; import com.asayama.gwt.jsni.client.JSClosure; import com.asayama.gwt.jsni.client.JSFunction; import com.google.gwt.core.client.JavaScriptObject; /** * Provide registers {@link Provider} with {@link Injector}. * <p> * <a href="http://docs.angularjs.org/api/auto/object/$provide"> * http://docs.angularjs.org/api/auto/object/$provide</a> * </p> * The documentation talks about many of these methods returning "registered * provider instance" but I do not know what that means. It seems that services * are instances of objects created by providers, and the providers appear to * be functions that return service instances, but I cannot figure out what * provider instance is. Could it be provider function? * * @author kyoken74 * @see AbstractModule */ public class Provide implements Service { @Injector.Inject NGProvide ngo; public <S extends Service> void provider(String name, Function<S> provider) { ngo.provider(name, JSFunction.create(provider)); } public <S extends Service> void factory(String name, Function<S> $getFn) { ngo.factory(name, JSFunction.create($getFn)); } public void service(String name, Closure constructor) { ngo.service(name, JSClosure.create(constructor)); } public void value(String name, Object value) { ngo.value(name, value); } public void constant(String name, Object value) { ngo.constant(name, value); } /** * @return decorated service? */ public <S extends Service> S decorator(String name, Function<S> decorator) { return ngo.decorator(name, JSFunction.create(decorator)); } } @Injector.Bind("$provide") class NGProvide extends JavaScriptObject { protected NGProvide() { } /** * @return registered provider instance? */ final native <S extends Service> Object provider(String name, JSFunction<S> provider) /*-{ return this.provider(name, provider); }-*/; /** * @return registered provider instance? */ final native <S extends Service> Object factory(String name, JSFunction<S> $getFn) /*-{ return this.provider(name, { $get: $getFn }); }-*/; /** * @return registered provider instance? */ final native <S extends Service> Object service(String name, JSClosure constructor) /*-{ return this.service(name, constructor); }-*/; /** * @return registered provider instance? */ final native Object value(String name, Object value) /*-{ return this.value(name, value); }-*/; /** * @return registered provider instance? */ final native Object constant(String name, Object value) /*-{ return this.constant(name, value); }-*/; /** * @return decorated service? */ final native <S extends Service> S decorator(String name, JSFunction<S> decorator) /*-{ return this.decorator(name, decorator); }-*/; }