Revision: 1399
Author: sberlin
Date: Sat Nov 20 19:41:40 2010
Log: Created wiki page through web user interface.
http://code.google.com/p/google-guice/source/detail?r=1399

Added:
 /wiki/InspectingModules.wiki

=======================================
--- /dev/null
+++ /wiki/InspectingModules.wiki        Sat Nov 20 19:41:40 2010
@@ -0,0 +1,55 @@
+#summary Introspecting what makes up a Module
+
+
+=Elements SPI=
+
+Guice provides a rich service provider interface (SPI) for all the elements that make up a module. You can use this SPI to learn what bindings are in a module and even rewrite some of those bindings. [http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/util/Modules.html#override(com.google.inject.Module...) Modules.override] is written entirely using this SPI.
+
+==Examining Elements==
+
+The [http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/Elements.html Elements] class provides access to each [http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/Element.html Element] within a Module. You can use this class to get individual elements from a module and take action upon them. Each Element has an acceptVisitor method that takes an [http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/ElementVisitor.html ElementVisitor]. You can use [http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/DefaultElementVisitor.html DefaultElementVisitor] to simplify writing a visitor.
+
+{{{
+  void warnAboutStaticInjections(Module... modules) {
+    for(Element element : Elements.getElements(modules)) {
+      element.acceptVisitor(new DefaultElementVisitor<Void>() {
+          @Override public void visit(StaticInjectionRequest request) {
+ System.out.println("You shouldn't be using static injection at: " + request.getSource());
+          }
+      });
+    }
+  }
+}}}
+
+==Manipulating Modules==
+
+You can use the SPI to do anything from stripping out elements to rewriting elements to adding new elements. When you've finished wiring your elements, you can turn them back into a module.
+
+{{{
+  Module stripStaticInjections(Module... modules) {
+    final List<Element> noStatics = Lists.newArrayList();
+    for(Element element : Elements.getElements(modules)) {
+      element.acceptVisitor(new DefaultElementVisitor<Void>() {
+        @Override public void visit(StaticInjectionRequest request) {
+          // override to not call visitOther
+        }
+
+        @Override public void visitOther(Element element) {
+          noStatics.add(element);
+        }
+      });
+    }
+    return Elements.getModule(noStatics);
+  }
+}}}
+
+==Binding Binoculars==
+
+The most common Element is a [Bindings Binding]. Bindings have more configuration than other elements and can be inspected in more ways. You can visit a binding's scope using [http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Binding.html#acceptScopingVisitor(com.google.inject.spi.BindingScopingVisitor<V>) Binding.acceptScopingVisitor], or figure out what kind of binding it is using [http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Binding.html#acceptTargetVisitor(com.google.inject.spi.BindingTargetVisitor<? super T, V>) Binding.acceptTargetVisitor]. Each of these methods have their own default visitors ( +[http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/DefaultBindingScopingVisitor.html DefaultBindingScopingVisitor] and [http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/spi/DefaultBindingTargetVisitor.html DefaultBindingTargetVisitor], respectively) to make visiting easier.
+
+Bindings can either be "Module bindings" or "Injector bindings". Injector bindings are bindings retrieved from an injector (see the [http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Injector.html Injector javadoc]). Module bindings are bindings retrieved using the Elements SPI. The [http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Binding.html Binding javadoc] explains the difference between these in more detail.
+
+== Extensions==
+
+Guice 3.0 adds the ability for extensions to write their own SPI. See [ExtensionSPI] for details.

--
You received this message because you are subscribed to the Google Groups 
"google-guice-dev" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-guice-dev?hl=en.

Reply via email to