<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.comp.java.jbehave.scm">
    <title>gmane.comp.java.jbehave.scm</title>
    <link>http://blog.gmane.org/gmane.comp.java.jbehave.scm</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3723"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3722"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3721"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3720"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3719"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3718"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3717"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3716"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3715"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3714"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3713"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3712"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3711"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3710"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3709"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3708"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3707"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3706"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3705"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3704"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3723">
    <title>[scm-core][1/1] JBEHAVE-922:  Added optional field name mapping, as suggested by Ghislain Nadeau.</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3723</link>
    <description>&lt;pre&gt;commit d1d6c12ca21bfd497882de5a4ed1d5f6fe632aa3
Author:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Tue, 18 Jun 2013 08:47:47 +0100
Commit:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Tue, 18 Jun 2013 08:47:47 +0100

    JBEHAVE-922:  Added optional field name mapping, as suggested by Ghislain Nadeau.

diff --git a/jbehave-core/src/main/java/org/jbehave/core/model/ExamplesTable.java b/jbehave-core/src/main/java/org/jbehave/core/model/ExamplesTable.java
index fbc0ba5..6624662 100755
--- a/jbehave-core/src/main/java/org/jbehave/core/model/ExamplesTable.java
+++ b/jbehave-core/src/main/java/org/jbehave/core/model/ExamplesTable.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -358,21 +358,25 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ExamplesTable {
     }
 
     public &amp;lt;T&amp;gt; List&amp;lt;T&amp;gt; getRowsAs(Class&amp;lt;T&amp;gt; type) {
+        return getRowsAs(type, new HashMap&amp;lt;String, String&amp;gt;());
+    }
+
+    public &amp;lt;T&amp;gt; List&amp;lt;T&amp;gt; getRowsAs(Class&amp;lt;T&amp;gt; type, Map&amp;lt;String, String&amp;gt; fieldNameMapping) {
         List&amp;lt;T&amp;gt; rows = new ArrayList&amp;lt;T&amp;gt;();
 
         for (Parameters parameters : getRowsAsParameters()) {
-            rows.add(mapToType(parameters, type));
+            rows.add(mapToType(parameters, type, fieldNameMapping));
         }
 
         return rows;
     }
 
-    private &amp;lt;T&amp;gt; T mapToType(Parameters parameters, Class&amp;lt;T&amp;gt; type) {
+    private &amp;lt;T&amp;gt; T mapToType(Parameters parameters, Class&amp;lt;T&amp;gt; type, Map&amp;lt;String, String&amp;gt; fieldNameMapping) {
         try {
             T instance = type.newInstance();
             Map&amp;lt;String, String&amp;gt; values = parameters.values();
             for (String name : values.keySet()) {
-                Field field = findField(type, name);
+                Field field = findField(type, name, fieldNameMapping);
                 Class&amp;lt;?&amp;gt; fieldType = (Class&amp;lt;?&amp;gt;) field.getGenericType();
                 Object value = parameters.valueAs(name, fieldType);
                 field.setAccessible(true);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -384,18 +388,24 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ExamplesTable {
         }
     }
 
-    private &amp;lt;T&amp;gt; Field findField(Class&amp;lt;T&amp;gt; type, String name) throws NoSuchFieldException {
+    private &amp;lt;T&amp;gt; Field findField(Class&amp;lt;T&amp;gt; type, String name, Map&amp;lt;String, String&amp;gt; fieldNameMapping)
+            throws NoSuchFieldException {
+        // Get field name from mapping, if specified
+        String fieldName = fieldNameMapping.get(name);
+        if (fieldName == null) {
+            fieldName = name;
+        }
         // First look for fields annotated by &amp;lt; at &amp;gt;Parameter specifying the name
         for (Field field : type.getDeclaredFields()) {
             if (field.isAnnotationPresent(Parameter.class)) {
                 Parameter parameter = field.getAnnotation(Parameter.class);
-                if (name.equals(parameter.name())) {
+                if (fieldName.equals(parameter.name())) {
                     return field;
                 }
             }
         }
         // Default to field matching given name
-        return type.getDeclaredField(name);
+        return type.getDeclaredField(fieldName);
     }
 
     private Parameters createParameters(Map&amp;lt;String, String&amp;gt; values) {
diff --git a/jbehave-core/src/test/java/org/jbehave/core/model/ExamplesTableBehaviour.java b/jbehave-core/src/test/java/org/jbehave/core/model/ExamplesTableBehaviour.java
index 88c22f0..9e7f32c 100755
--- a/jbehave-core/src/test/java/org/jbehave/core/model/ExamplesTableBehaviour.java
+++ b/jbehave-core/src/test/java/org/jbehave/core/model/ExamplesTableBehaviour.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -302,7 +302,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ExamplesTableBehaviour {
     }
 
     &amp;lt; at &amp;gt;Test
-    public void shouldMapParametersToAnnotatedType() throws Exception {
+    public void shouldMapParametersToType() throws Exception {
         // Given
         ExamplesTableFactory factory = new ExamplesTableFactory();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -318,7 +318,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ExamplesTableBehaviour {
     }
 
     &amp;lt; at &amp;gt;Test
-    public void shouldMapParametersToAnnotatedTypeWithAnnotatedFields() throws Exception {
+    public void shouldMapParametersToTypeWithFieldMappings() throws Exception {
+        // Given
+        ExamplesTableFactory factory = new ExamplesTableFactory();
+
+        // When
+        String tableAsString = "|aString|anInteger|\n|11|22|";
+        ExamplesTable examplesTable = factory.createExamplesTable(tableAsString);
+
+        Map&amp;lt;String, String&amp;gt; nameMapping = new HashMap&amp;lt;String, String&amp;gt;();
+        nameMapping.put("aString", "string");
+        nameMapping.put("anInteger", "integer");
+        
+        // Then
+        for (MyParameters parameters : examplesTable.getRowsAs(MyParameters.class, nameMapping)) {
+            assertThat(parameters.string, equalTo("11"));
+            assertThat(parameters.integer, equalTo(22));
+        }
+    }
+
+    &amp;lt; at &amp;gt;Test
+    public void shouldMapParametersToTypeWithAnnotatedFields() throws Exception {
         // Given
         ExamplesTableFactory factory = new ExamplesTableFactory();
 



&lt;/pre&gt;</description>
    <dc:creator>Mauro Talevi</dc:creator>
    <dc:date>2013-06-18T07:48:03</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3722">
    <title>[scm-core][1/1] Added story.filter property.</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3722</link>
    <description>&lt;pre&gt;commit 3710a6f6b29f5ca14e1dbe057192e7bd9ba09859
Author:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Mon, 17 Jun 2013 09:02:17 +0100
Commit:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Mon, 17 Jun 2013 09:02:17 +0100

    Added story.filter property.

diff --git a/examples/core/src/main/java/org/jbehave/examples/core/CoreStories.java b/examples/core/src/main/java/org/jbehave/examples/core/CoreStories.java
index 1fce869..2da31fa 100755
--- a/examples/core/src/main/java/org/jbehave/examples/core/CoreStories.java
+++ b/examples/core/src/main/java/org/jbehave/examples/core/CoreStories.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -48,7 +48,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import static org.jbehave.core.reporters.Format.XML_TEMPLATE;
  * Example of how multiple stories can be run via JUnit.
  * &amp;lt;/p&amp;gt;
  * &amp;lt;p&amp;gt;
- * Stories are specified in classpath and correspondingly the {&amp;lt; at &amp;gt;link LoadFromClasspath} story loader is configured.
+ * Stories are specified in classpath and correspondingly the
+ * {&amp;lt; at &amp;gt;link LoadFromClasspath} story loader is configured.
  * &amp;lt;/p&amp;gt;
  */
 public class CoreStories extends JUnitStories {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -58,7 +59,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class CoreStories extends JUnitStories {
     public CoreStories() {
         configuredEmbedder().embedderControls().doGenerateViewAfterStories(true).doIgnoreFailureInStories(false)
                 .doIgnoreFailureInView(true).doVerboseFailures(true).useThreads(2).useStoryTimeoutInSecs(60);
-        //configuredEmbedder().useEmbedderControls(new PropertyBasedEmbedderControls());
+        // configuredEmbedder().useEmbedderControls(new
+        // PropertyBasedEmbedderControls());
     }
 
     &amp;lt; at &amp;gt;Override
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -69,40 +71,39 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class CoreStories extends JUnitStories {
         viewResources.put("reports", "ftl/jbehave-reports-with-totals.ftl");
         // Start from default ParameterConverters instance
         ParameterConverters parameterConverters = new ParameterConverters();
-        // factory to allow parameter conversion and loading from external resources (used by StoryParser too)
-        ExamplesTableFactory examplesTableFactory = new ExamplesTableFactory(new LocalizedKeywords(), new LoadFromClasspath(embeddableClass), parameterConverters, new TableTransformers());
+        // factory to allow parameter conversion and loading from external
+        // resources (used by StoryParser too)
+        ExamplesTableFactory examplesTableFactory = new ExamplesTableFactory(new LocalizedKeywords(),
+                new LoadFromClasspath(embeddableClass), parameterConverters, new TableTransformers());
         // add custom converters
         parameterConverters.addConverters(new DateConverter(new SimpleDateFormat("yyyy-MM-dd")),
                 new ExamplesTableConverter(examplesTableFactory));
         return new MostUsefulConfiguration()
                 .useStoryLoader(new LoadFromClasspath(embeddableClass))
                 .useStoryParser(new RegexStoryParser(examplesTableFactory))
-            .useStoryReporterBuilder(new StoryReporterBuilder()
+                .useStoryReporterBuilder(
+                        new StoryReporterBuilder()
                                 .withCodeLocation(CodeLocations.codeLocationFromClass(embeddableClass))
-                .withDefaultFormats()
-                .withViewResources(viewResources)
-                .withFormats(CONSOLE, TXT, HTML_TEMPLATE, XML_TEMPLATE)
-                .withFailureTrace(true)
-                .withFailureTraceCompression(true)                
-                .withCrossReference(xref)) 
+                                .withDefaultFormats().withViewResources(viewResources)
+                                .withFormats(CONSOLE, TXT, HTML_TEMPLATE, XML_TEMPLATE).withFailureTrace(true)
+                                .withFailureTraceCompression(true).withCrossReference(xref))
                 .useParameterConverters(parameterConverters)
                 // use '%' instead of '$' to identify parameters
-            .useStepPatternParser(new RegexPrefixCapturingPatternParser(
-                            "%")) 
-            .useStepMonitor(xref.getStepMonitor());                               
+                .useStepPatternParser(new RegexPrefixCapturingPatternParser("%")).useStepMonitor(xref.getStepMonitor());
     }
 
     &amp;lt; at &amp;gt;Override
     public InjectableStepsFactory stepsFactory() {
-        return new InstanceStepsFactory(configuration(), new TraderSteps(new TradingService()), new AndSteps(), new MetaParametrisationSteps(),
-                new CalendarSteps(), new PriorityMatchingSteps(), new PendingSteps(), new SandpitSteps(),
-                new SearchSteps(), new BeforeAfterSteps(), new CompositeSteps(), new NamedParametersSteps(), new ExamplesTableParametersSteps());
+        return new InstanceStepsFactory(configuration(), new TraderSteps(new TradingService()), new AndSteps(),
+                new MetaParametrisationSteps(), new CalendarSteps(), new PriorityMatchingSteps(), new PendingSteps(),
+                new SandpitSteps(), new SearchSteps(), new BeforeAfterSteps(), new CompositeSteps(),
+                new NamedParametersSteps(), new ExamplesTableParametersSteps());
     }
 
     &amp;lt; at &amp;gt;Override
     protected List&amp;lt;String&amp;gt; storyPaths() {
-        return new StoryFinder().findPaths(codeLocationFromClass(this.getClass()), "**/stories/*parameters.story", "**/failing_before*.story");
-                
+        String filter = System.getProperty("story.filter", "**/*.story");
+        return new StoryFinder().findPaths(codeLocationFromClass(this.getClass()), filter, "**/failing_before*.story");
     }
 
 }
\ No newline at end of file



&lt;/pre&gt;</description>
    <dc:creator>Mauro Talevi</dc:creator>
    <dc:date>2013-06-17T08:02:24</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3721">
    <title>[scm-core][1/1] JBEHAVE-922:  Renamed example custom type, used both for annotated and non-annotated parameter mapping.</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3721</link>
    <description>&lt;pre&gt;commit 295174411643f838588b2aa79d63bea20213ec56
Author:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Mon, 17 Jun 2013 08:53:07 +0100
Commit:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Mon, 17 Jun 2013 08:53:07 +0100

    JBEHAVE-922:  Renamed example custom type, used both for annotated and non-annotated parameter mapping.

diff --git a/examples/core/src/main/java/org/jbehave/examples/core/steps/ExamplesTableParametersSteps.java b/examples/core/src/main/java/org/jbehave/examples/core/steps/ExamplesTableParametersSteps.java
index d171418..3683ac6 100644
--- a/examples/core/src/main/java/org/jbehave/examples/core/steps/ExamplesTableParametersSteps.java
+++ b/examples/core/src/main/java/org/jbehave/examples/core/steps/ExamplesTableParametersSteps.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -12,27 +12,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import org.jbehave.core.annotations.Parameter;
 public class ExamplesTableParametersSteps {
 
     &amp;lt; at &amp;gt;Given("the parameters mapped via annotations to custom types: %table")
-    public void givenTheAnnotatedParametersList(List&amp;lt;AnnotatedParameters&amp;gt; list) {
+    public void givenTheMyParametersList(List&amp;lt;MyParameters&amp;gt; list) {
         System.out.println("List annotated: "+list);
     }
 
     &amp;lt; at &amp;gt;Given("the parameters mapped via annotations to custom type: %table")
-    public void givenTheAnnotatedParametersType(AnnotatedParameters type) {
-        System.out.println("Single annotated: "+type);
+    public void givenTheMyParametersType(MyParameters single) {
+        System.out.println("Single annotated: "+single);
     }
 
     &amp;lt; at &amp;gt;Given("the parameters mapped via names to custom types: %table")
-    public void givenTheNamedParametersList(List&amp;lt;AnnotatedParameters&amp;gt; list) {
+    public void givenTheNamedParametersList(List&amp;lt;MyParameters&amp;gt; list) {
         System.out.println("List named: "+list);
     }
 
     &amp;lt; at &amp;gt;Given("the parameters mapped via names to custom type: %table")
-    public void givenTheNamedParametersType(AnnotatedParameters type) {
-        System.out.println("Single named: "+type);
+    public void givenTheNamedParametersType(MyParameters single) {
+        System.out.println("Single named: "+single);
     }
 
     &amp;lt; at &amp;gt;AsParameters
-    public static class AnnotatedParameters {
+    public static class MyParameters {
         &amp;lt; at &amp;gt;Parameter(name = "aString")
         private String string;
         &amp;lt; at &amp;gt;Parameter(name = "anInteger")



&lt;/pre&gt;</description>
    <dc:creator>Mauro Talevi</dc:creator>
    <dc:date>2013-06-17T07:53:19</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3720">
    <title>[scm-core][3/3] JBEHAVE-922:  Added examples_table_parameters.story to verify behaviour.</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3720</link>
    <description>&lt;pre&gt;commit 6171df6b75eeb738308e060aa9668c7421ea07ce
Author:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Sun, 16 Jun 2013 18:46:26 +0100
Commit:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Sun, 16 Jun 2013 18:46:26 +0100

    JBEHAVE-922:  Added examples_table_parameters.story to verify behaviour.

diff --git a/examples/core/src/main/java/org/jbehave/examples/core/CoreStories.java b/examples/core/src/main/java/org/jbehave/examples/core/CoreStories.java
index 13720f9..1fce869 100755
--- a/examples/core/src/main/java/org/jbehave/examples/core/CoreStories.java
+++ b/examples/core/src/main/java/org/jbehave/examples/core/CoreStories.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -28,6 +28,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import org.jbehave.examples.core.steps.AndSteps;
 import org.jbehave.examples.core.steps.BeforeAfterSteps;
 import org.jbehave.examples.core.steps.CalendarSteps;
 import org.jbehave.examples.core.steps.CompositeSteps;
+import org.jbehave.examples.core.steps.ExamplesTableParametersSteps;
 import org.jbehave.examples.core.steps.MetaParametrisationSteps;
 import org.jbehave.examples.core.steps.NamedParametersSteps;
 import org.jbehave.examples.core.steps.PendingSteps;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -95,12 +96,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class CoreStories extends JUnitStories {
     public InjectableStepsFactory stepsFactory() {
         return new InstanceStepsFactory(configuration(), new TraderSteps(new TradingService()), new AndSteps(), new MetaParametrisationSteps(),
                 new CalendarSteps(), new PriorityMatchingSteps(), new PendingSteps(), new SandpitSteps(),
-                new SearchSteps(), new BeforeAfterSteps(), new CompositeSteps(), new NamedParametersSteps());
+                new SearchSteps(), new BeforeAfterSteps(), new CompositeSteps(), new NamedParametersSteps(), new ExamplesTableParametersSteps());
     }
 
     &amp;lt; at &amp;gt;Override
     protected List&amp;lt;String&amp;gt; storyPaths() {
-        return new StoryFinder().findPaths(codeLocationFromClass(this.getClass()), "**/stories/*.story", "**/failing_before*.story");
+        return new StoryFinder().findPaths(codeLocationFromClass(this.getClass()), "**/stories/*parameters.story", "**/failing_before*.story");
                 
     }
         
diff --git a/examples/core/src/main/java/org/jbehave/examples/core/CoreStory.java b/examples/core/src/main/java/org/jbehave/examples/core/CoreStory.java
index 6707520..d967ea8 100755
--- a/examples/core/src/main/java/org/jbehave/examples/core/CoreStory.java
+++ b/examples/core/src/main/java/org/jbehave/examples/core/CoreStory.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -31,6 +31,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import org.jbehave.examples.core.steps.BeforeAfterSteps;
 import org.jbehave.examples.core.steps.CalendarSteps;
 import org.jbehave.examples.core.steps.CompositeNestedSteps;
 import org.jbehave.examples.core.steps.CompositeSteps;
+import org.jbehave.examples.core.steps.ExamplesTableParametersSteps;
 import org.jbehave.examples.core.steps.MetaParametrisationSteps;
 import org.jbehave.examples.core.steps.NamedParametersSteps;
 import org.jbehave.examples.core.steps.ParameterDelimitersSteps;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -108,7 +109,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public abstract class CoreStory extends JUnitStory {
                 new MetaParametrisationSteps(), new CalendarSteps(), new PriorityMatchingSteps(), new PendingSteps(),
                 new ParametrisedSteps(), new SandpitSteps(), new SearchSteps(), new BeforeAfterSteps(),
                 new CompositeSteps(), new CompositeNestedSteps(), new NamedParametersSteps(),
-                new ParameterDelimitersSteps());
+                new ParameterDelimitersSteps(), new ExamplesTableParametersSteps());
     }
 
 }
diff --git a/examples/core/src/main/java/org/jbehave/examples/core/steps/ExamplesTableParametersSteps.java b/examples/core/src/main/java/org/jbehave/examples/core/steps/ExamplesTableParametersSteps.java
new file mode 100644
index 0000000..d171418
--- /dev/null
+++ b/examples/core/src/main/java/org/jbehave/examples/core/steps/ExamplesTableParametersSteps.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,49 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.examples.core.steps;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.jbehave.core.annotations.AsParameters;
+import org.jbehave.core.annotations.Given;
+import org.jbehave.core.annotations.Parameter;
+
+public class ExamplesTableParametersSteps {
+
+    &amp;lt; at &amp;gt;Given("the parameters mapped via annotations to custom types: %table")
+    public void givenTheAnnotatedParametersList(List&amp;lt;AnnotatedParameters&amp;gt; list) {
+        System.out.println("List annotated: "+list);
+    }
+
+    &amp;lt; at &amp;gt;Given("the parameters mapped via annotations to custom type: %table")
+    public void givenTheAnnotatedParametersType(AnnotatedParameters type) {
+        System.out.println("Single annotated: "+type);
+    }
+
+    &amp;lt; at &amp;gt;Given("the parameters mapped via names to custom types: %table")
+    public void givenTheNamedParametersList(List&amp;lt;AnnotatedParameters&amp;gt; list) {
+        System.out.println("List named: "+list);
+    }
+
+    &amp;lt; at &amp;gt;Given("the parameters mapped via names to custom type: %table")
+    public void givenTheNamedParametersType(AnnotatedParameters type) {
+        System.out.println("Single named: "+type);
+    }
+
+    &amp;lt; at &amp;gt;AsParameters
+    public static class AnnotatedParameters {
+        &amp;lt; at &amp;gt;Parameter(name = "aString")
+        private String string;
+        &amp;lt; at &amp;gt;Parameter(name = "anInteger")
+        private Integer integer;
+        &amp;lt; at &amp;gt;Parameter(name = "aBigDecimal")
+        private BigDecimal bigDecimal;
+        
+        &amp;lt; at &amp;gt;Override
+        public String toString() {
+            return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
+        }
+    }
+
+}
diff --git a/examples/core/src/main/java/org/jbehave/examples/core/stories/ExamplesTableParameters.java b/examples/core/src/main/java/org/jbehave/examples/core/stories/ExamplesTableParameters.java
new file mode 100644
index 0000000..2a61dc2
--- /dev/null
+++ b/examples/core/src/main/java/org/jbehave/examples/core/stories/ExamplesTableParameters.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.examples.core.stories;
+
+import org.jbehave.examples.core.CoreStory;
+
+public class ExamplesTableParameters extends CoreStory {
+
+}
diff --git a/examples/core/src/main/java/org/jbehave/examples/core/stories/examples_table_parameters.story b/examples/core/src/main/java/org/jbehave/examples/core/stories/examples_table_parameters.story
new file mode 100644
index 0000000..7ee9da1
--- /dev/null
+++ b/examples/core/src/main/java/org/jbehave/examples/core/stories/examples_table_parameters.story
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+Scenario:  Mapping parameters to custom types via annotations and field names 
+
+Given the parameters mapped via annotations to custom types: 
+| aString | anInteger | aBigDecimal |
+|  blah   |  1234     |  1.234      |
+|  blah   |  7890     |  7.890      |
+Given the parameters mapped via annotations to custom type: 
+| aString | anInteger | aBigDecimal |
+|  blah   |  1234     |  1.234      |
+Given the parameters mapped via names to custom types: 
+| string | integer | bigDecimal |
+|  blah  |  1234   |  1.234     |
+|  blah  |  7890   |  7.890     |
+Given the parameters mapped via names to custom type: 
+| string | integer | bigDecimal |
+|  blah  |  1234   |  1.234     |
+



&lt;/pre&gt;</description>
    <dc:creator>Mauro Talevi</dc:creator>
    <dc:date>2013-06-16T17:46:44</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3719">
    <title>[scm-core][2/3] JBEHAVE-922:  Added &lt; at &gt;Parameter annotation to support mapping fields with different names from parameters.</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3719</link>
    <description>&lt;pre&gt;commit c9843d0fd24cf79978929ca4e41f974a7a526cef
Author:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Sun, 16 Jun 2013 17:00:08 +0100
Commit:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Sun, 16 Jun 2013 17:00:08 +0100

    JBEHAVE-922:  Added &amp;lt; at &amp;gt;Parameter annotation to support mapping fields with different names from parameters.

diff --git a/jbehave-core/src/main/java/org/jbehave/core/annotations/Parameter.java b/jbehave-core/src/main/java/org/jbehave/core/annotations/Parameter.java
new file mode 100644
index 0000000..4c3b53f
--- /dev/null
+++ b/jbehave-core/src/main/java/org/jbehave/core/annotations/Parameter.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.core.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+&amp;lt; at &amp;gt;Retention(RetentionPolicy.RUNTIME)
+&amp;lt; at &amp;gt;Target(ElementType.FIELD)
+&amp;lt; at &amp;gt;Documented
+public &amp;lt; at &amp;gt;interface Parameter {
+
+    String name();
+
+}
diff --git a/jbehave-core/src/main/java/org/jbehave/core/model/ExamplesTable.java b/jbehave-core/src/main/java/org/jbehave/core/model/ExamplesTable.java
index 9a51b19..fbc0ba5 100755
--- a/jbehave-core/src/main/java/org/jbehave/core/model/ExamplesTable.java
+++ b/jbehave-core/src/main/java/org/jbehave/core/model/ExamplesTable.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -16,6 +16,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import java.util.regex.Pattern;
 
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.apache.commons.lang.builder.ToStringStyle;
+import org.jbehave.core.annotations.Parameter;
 import org.jbehave.core.model.TableTransformers.TableTransformer;
 import org.jbehave.core.steps.ChainedRow;
 import org.jbehave.core.steps.ConvertedParameters;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -168,7 +169,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ExamplesTable {
 
     public ExamplesTable(String tableAsString, String headerSeparator, String valueSeparator,
             String ignorableSeparator, ParameterConverters parameterConverters) {
-        this(tableAsString, headerSeparator, valueSeparator, ignorableSeparator, parameterConverters, new TableTransformers());
+        this(tableAsString, headerSeparator, valueSeparator, ignorableSeparator, parameterConverters,
+                new TableTransformers());
     }
 
     public ExamplesTable(String tableAsString, String headerSeparator, String valueSeparator,
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -370,18 +372,32 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ExamplesTable {
             T instance = type.newInstance();
             Map&amp;lt;String, String&amp;gt; values = parameters.values();
             for (String name : values.keySet()) {
-                Field f = type.getDeclaredField(name);
-                Class&amp;lt;?&amp;gt; fieldType = (Class&amp;lt;?&amp;gt;) f.getGenericType();
+                Field field = findField(type, name);
+                Class&amp;lt;?&amp;gt; fieldType = (Class&amp;lt;?&amp;gt;) field.getGenericType();
                 Object value = parameters.valueAs(name, fieldType);
-                f.setAccessible(true);
-                f.set(instance, value);
+                field.setAccessible(true);
+                field.set(instance, value);
             }
             return instance;
         } catch (Exception e) {
-            throw new RuntimeException("Failed to map parameters to type "+type, e);
+            throw new ParametersNotMappableToType(parameters, type, e);
         }
     }
 
+    private &amp;lt;T&amp;gt; Field findField(Class&amp;lt;T&amp;gt; type, String name) throws NoSuchFieldException {
+        // First look for fields annotated by &amp;lt; at &amp;gt;Parameter specifying the name
+        for (Field field : type.getDeclaredFields()) {
+            if (field.isAnnotationPresent(Parameter.class)) {
+                Parameter parameter = field.getAnnotation(Parameter.class);
+                if (name.equals(parameter.name())) {
+                    return field;
+                }
+            }
+        }
+        // Default to field matching given name
+        return type.getDeclaredField(name);
+    }
+
     private Parameters createParameters(Map&amp;lt;String, String&amp;gt; values) {
         return new ConvertedParameters(new ChainedRow(new ConvertedParameters(values, parameterConverters), defaults),
                 parameterConverters);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -436,4 +452,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ExamplesTable {
 
     }
 
+    &amp;lt; at &amp;gt;SuppressWarnings("serial")
+    public static class ParametersNotMappableToType extends RuntimeException {
+
+        public ParametersNotMappableToType(Parameters parameters, Class&amp;lt;?&amp;gt; type, Exception e) {
+            super(parameters.values() + " not mappable to type " + type, e);
+        }
+
+    }
+
 }
diff --git a/jbehave-core/src/test/java/org/jbehave/core/model/ExamplesTableBehaviour.java b/jbehave-core/src/test/java/org/jbehave/core/model/ExamplesTableBehaviour.java
index 63688ef..88c22f0 100755
--- a/jbehave-core/src/test/java/org/jbehave/core/model/ExamplesTableBehaviour.java
+++ b/jbehave-core/src/test/java/org/jbehave/core/model/ExamplesTableBehaviour.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -20,6 +20,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.commons.lang.builder.ToStringBuilder;
 import org.apache.commons.lang.builder.ToStringStyle;
 import org.jbehave.core.annotations.AsParameters;
+import org.jbehave.core.annotations.Parameter;
 import org.jbehave.core.model.ExamplesTable.RowNotFound;
 import org.jbehave.core.model.TableTransformers.TableTransformer;
 import org.jbehave.core.steps.ConvertedParameters.ValueNotFound;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -301,7 +302,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ExamplesTableBehaviour {
     }
 
     &amp;lt; at &amp;gt;Test
-    public void shouldMapTableRowToCustomType() throws Exception {
+    public void shouldMapParametersToAnnotatedType() throws Exception {
         // Given
         ExamplesTableFactory factory = new ExamplesTableFactory();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -317,6 +318,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ExamplesTableBehaviour {
     }
 
     &amp;lt; at &amp;gt;Test
+    public void shouldMapParametersToAnnotatedTypeWithAnnotatedFields() throws Exception {
+        // Given
+        ExamplesTableFactory factory = new ExamplesTableFactory();
+
+        // When
+        String tableAsString = "|aString|anInteger|\n|11|22|";
+        ExamplesTable examplesTable = factory.createExamplesTable(tableAsString);
+
+        // Then
+        for (MyParametersWithAnnotatedFields parameters : examplesTable.getRowsAs(MyParametersWithAnnotatedFields.class)) {
+            assertThat(parameters.string, equalTo("11"));
+            assertThat(parameters.integer, equalTo(22));
+        }
+    }
+
+    &amp;lt; at &amp;gt;Test
     public void shouldThrowExceptionIfValuesOrRowsAreNotFound() throws Exception {
         // Given
         ParameterConverters parameterConverters = new ParameterConverters();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -458,4 +475,19 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ExamplesTableBehaviour {
             return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
         }
     }
+
+    &amp;lt; at &amp;gt;AsParameters
+    public static class MyParametersWithAnnotatedFields {
+
+        &amp;lt; at &amp;gt;Parameter(name = "aString")
+        private String string;
+        &amp;lt; at &amp;gt;Parameter(name = "anInteger")
+        private Integer integer;
+
+        &amp;lt; at &amp;gt;Override
+        public String toString() {
+            return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
+        }
+    }
+
 }



&lt;/pre&gt;</description>
    <dc:creator>Mauro Talevi</dc:creator>
    <dc:date>2013-06-16T17:46:43</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3718">
    <title>[scm-core][1/3] JBEHAVE-922:  Added ExamplesTableParametersConverter.</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3718</link>
    <description>&lt;pre&gt;commit bae96e32c1833ec2aee54fec1db5be17955176a1
Author:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Sun, 16 Jun 2013 16:21:06 +0100
Commit:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Sun, 16 Jun 2013 16:21:06 +0100

    JBEHAVE-922:  Added ExamplesTableParametersConverter.

diff --git a/jbehave-core/src/main/java/org/jbehave/core/annotations/AsParameters.java b/jbehave-core/src/main/java/org/jbehave/core/annotations/AsParameters.java
new file mode 100644
index 0000000..46cabfb
--- /dev/null
+++ b/jbehave-core/src/main/java/org/jbehave/core/annotations/AsParameters.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.core.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+&amp;lt; at &amp;gt;Retention(RetentionPolicy.RUNTIME)
+&amp;lt; at &amp;gt;Target(ElementType.TYPE)
+&amp;lt; at &amp;gt;Documented
+public &amp;lt; at &amp;gt;interface AsParameters {
+
+}
diff --git a/jbehave-core/src/main/java/org/jbehave/core/model/ExamplesTable.java b/jbehave-core/src/main/java/org/jbehave/core/model/ExamplesTable.java
index 4074a58..9a51b19 100755
--- a/jbehave-core/src/main/java/org/jbehave/core/model/ExamplesTable.java
+++ b/jbehave-core/src/main/java/org/jbehave/core/model/ExamplesTable.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3,6 +3,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; package org.jbehave.core.model;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.PrintStream;
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -354,6 +355,33 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ExamplesTable {
         return rows;
     }
 
+    public &amp;lt;T&amp;gt; List&amp;lt;T&amp;gt; getRowsAs(Class&amp;lt;T&amp;gt; type) {
+        List&amp;lt;T&amp;gt; rows = new ArrayList&amp;lt;T&amp;gt;();
+
+        for (Parameters parameters : getRowsAsParameters()) {
+            rows.add(mapToType(parameters, type));
+        }
+
+        return rows;
+    }
+
+    private &amp;lt;T&amp;gt; T mapToType(Parameters parameters, Class&amp;lt;T&amp;gt; type){
+        try {
+            T instance = type.newInstance();
+            Map&amp;lt;String, String&amp;gt; values = parameters.values();
+            for ( String name : values.keySet() ){
+                Field f = type.getDeclaredField(name);
+                Class&amp;lt;?&amp;gt; fieldType = (Class&amp;lt;?&amp;gt;) f.getGenericType();
+                Object value = parameters.valueAs(name, fieldType);    
+                f.setAccessible(true);
+                f.set(instance, value);
+            }
+            return instance;
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to map parameters to type "+type, e);
+        }
+    }
+       
     private Parameters createParameters(Map&amp;lt;String, String&amp;gt; values) {
         return new ConvertedParameters(new ChainedRow(new ConvertedParameters(values, parameterConverters), defaults),
                 parameterConverters);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -407,4 +435,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ExamplesTable {
         }
 
     }
+
 }
diff --git a/jbehave-core/src/main/java/org/jbehave/core/steps/ParameterConverters.java b/jbehave-core/src/main/java/org/jbehave/core/steps/ParameterConverters.java
index c21496d..fd3249f 100755
--- a/jbehave-core/src/main/java/org/jbehave/core/steps/ParameterConverters.java
+++ b/jbehave-core/src/main/java/org/jbehave/core/steps/ParameterConverters.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -20,6 +20,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.commons.lang.BooleanUtils;
+import org.jbehave.core.annotations.AsParameters;
 import org.jbehave.core.configuration.MostUsefulConfiguration;
 import org.jbehave.core.model.ExamplesTable;
 import org.jbehave.core.model.ExamplesTableFactory;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -41,6 +42,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import static java.util.Arrays.asList;
  * &amp;lt;li&amp;gt;{&amp;lt; at &amp;gt;link ParameterConverters.DateConverter DateConverter}&amp;lt;/li&amp;gt;
  * &amp;lt;li&amp;gt;{&amp;lt; at &amp;gt;link ParameterConverters.ExamplesTableConverter ExamplesTableConverter}
  * &amp;lt;/li&amp;gt;
+ * &amp;lt;li&amp;gt;{&amp;lt; at &amp;gt;link ParameterConverters.ExamplesTableParametersConverter
+ * ExamplesTableParametersConverter}&amp;lt;/li&amp;gt;
  * &amp;lt;li&amp;gt;{&amp;lt; at &amp;gt;link ParameterConverters.MethodReturningConverter
  * MethodReturningConverter}&amp;lt;/li&amp;gt;
  * &amp;lt;/ul&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -116,11 +119,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ParameterConverters {
 
     protected ParameterConverter[] defaultConverters(Locale locale, String listSeparator) {
         String escapedListSeparator = escapeRegexPunctuation(listSeparator);
+        ExamplesTableFactory tableFactory = new ExamplesTableFactory(this);
         ParameterConverter[] defaultConverters = { new BooleanConverter(),
                 new NumberConverter(NumberFormat.getInstance(locale)),
                 new NumberListConverter(NumberFormat.getInstance(locale), escapedListSeparator),
                 new StringListConverter(escapedListSeparator), new DateConverter(),
-                new ExamplesTableConverter(new ExamplesTableFactory(this)) };
+                new ExamplesTableConverter(tableFactory), new ExamplesTableParametersConverter(tableFactory) };
         return defaultConverters;
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -640,6 +644,58 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ParameterConverters {
     }
 
     /**
+     * Converts ExamplesTable to list of parameters, mapped to annotated custom
+     * types.
+     */
+    public static class ExamplesTableParametersConverter implements ParameterConverter {
+
+        private final ExamplesTableFactory factory;
+
+        public ExamplesTableParametersConverter() {
+            this(new ExamplesTableFactory());
+        }
+
+        public ExamplesTableParametersConverter(ExamplesTableFactory factory) {
+            this.factory = factory;
+        }
+
+        public boolean accept(Type type) {
+            if (type instanceof ParameterizedType) {
+                Class&amp;lt;?&amp;gt; rawClass = rawClass(type);
+                Class&amp;lt;?&amp;gt; argumentClass = argumentClass(type);
+                if (rawClass.isAnnotationPresent(AsParameters.class)
+                        || argumentClass.isAnnotationPresent(AsParameters.class)) {
+                    return true;
+                }
+            } else if (type instanceof Class) {
+                return ((Class&amp;lt;?&amp;gt;) type).isAnnotationPresent(AsParameters.class);
+            }
+            return false;
+        }
+
+        private Class&amp;lt;?&amp;gt; rawClass(Type type) {
+            return (Class&amp;lt;?&amp;gt;) ((ParameterizedType) type).getRawType();
+        }
+
+        private Class&amp;lt;?&amp;gt; argumentClass(Type type) {
+            if (type instanceof ParameterizedType) {
+                return (Class&amp;lt;?&amp;gt;) ((ParameterizedType) type).getActualTypeArguments()[0];
+            } else {
+                return (Class&amp;lt;?&amp;gt;) type;
+            }
+        }
+
+        public Object convertValue(String value, Type type) {
+            List&amp;lt;?&amp;gt; rows = factory.createExamplesTable(value).getRowsAs(argumentClass(type));
+            if (type instanceof ParameterizedType) {
+                return rows;
+            }
+            return rows.iterator().next();
+        }
+
+    }
+
+    /**
      * Invokes method on instance to return value.
      */
     public static class MethodReturningConverter implements ParameterConverter {
diff --git a/jbehave-core/src/test/java/org/jbehave/core/model/ExamplesTableBehaviour.java b/jbehave-core/src/test/java/org/jbehave/core/model/ExamplesTableBehaviour.java
index d9b67ec..63688ef 100755
--- a/jbehave-core/src/test/java/org/jbehave/core/model/ExamplesTableBehaviour.java
+++ b/jbehave-core/src/test/java/org/jbehave/core/model/ExamplesTableBehaviour.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -17,6 +17,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import java.util.Map;
 import java.util.Properties;
 
 import org.apache.commons.io.output.ByteArrayOutputStream;
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.jbehave.core.annotations.AsParameters;
 import org.jbehave.core.model.ExamplesTable.RowNotFound;
 import org.jbehave.core.model.TableTransformers.TableTransformer;
 import org.jbehave.core.steps.ConvertedParameters.ValueNotFound;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -298,6 +301,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ExamplesTableBehaviour {
     }
 
     &amp;lt; at &amp;gt;Test
+    public void shouldMapTableRowToCustomType() throws Exception {
+        // Given
+        ExamplesTableFactory factory = new ExamplesTableFactory();
+
+        // When
+        String tableAsString = "|string|integer|\n|11|22|";
+        ExamplesTable examplesTable = factory.createExamplesTable(tableAsString);
+
+        // Then
+        for (MyParameters parameters : examplesTable.getRowsAs(MyParameters.class)) {
+            assertThat(parameters.string, equalTo("11"));
+            assertThat(parameters.integer, equalTo(22));
+        }
+    }
+
+    &amp;lt; at &amp;gt;Test
     public void shouldThrowExceptionIfValuesOrRowsAreNotFound() throws Exception {
         // Given
         ParameterConverters parameterConverters = new ParameterConverters();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -428,4 +447,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ExamplesTableBehaviour {
         return null;
     }
 
+    &amp;lt; at &amp;gt;AsParameters
+    public static class MyParameters {
+
+        private String string;
+        private Integer integer;
+
+        &amp;lt; at &amp;gt;Override
+        public String toString() {
+            return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
+        }
+    }
 }
diff --git a/jbehave-core/src/test/java/org/jbehave/core/steps/ParameterConvertersBehaviour.java b/jbehave-core/src/test/java/org/jbehave/core/steps/ParameterConvertersBehaviour.java
index 06d3cdd..bf3927c 100755
--- a/jbehave-core/src/test/java/org/jbehave/core/steps/ParameterConvertersBehaviour.java
+++ b/jbehave-core/src/test/java/org/jbehave/core/steps/ParameterConvertersBehaviour.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -28,19 +28,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import org.jbehave.core.steps.ParameterConverters.DateConverter;
 import org.jbehave.core.steps.ParameterConverters.EnumConverter;
 import org.jbehave.core.steps.ParameterConverters.EnumListConverter;
 import org.jbehave.core.steps.ParameterConverters.ExamplesTableConverter;
+import org.jbehave.core.steps.ParameterConverters.ExamplesTableParametersConverter;
 import org.jbehave.core.steps.ParameterConverters.MethodReturningConverter;
 import org.jbehave.core.steps.ParameterConverters.NumberConverter;
 import org.jbehave.core.steps.ParameterConverters.NumberListConverter;
 import org.jbehave.core.steps.ParameterConverters.ParameterConverter;
 import org.jbehave.core.steps.ParameterConverters.ParameterConvertionFailed;
 import org.jbehave.core.steps.ParameterConverters.StringListConverter;
+import org.jbehave.core.steps.SomeSteps.MyParameters;
 import org.junit.Test;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
 
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.mock;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -337,7 +339,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ParameterConvertersBehaviour {
     }
 
     &amp;lt; at &amp;gt;Test
-    public void shouldConvertMultilineTableParameter() throws ParseException, IntrospectionException {
+    public void shouldConvertMultilineTable() throws ParseException, IntrospectionException {
         ParameterConverter converter = new ExamplesTableConverter();
         assertThat(converter.accept(ExamplesTable.class), is(true));
         assertThat(converter.accept(WrongType.class), is(false));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -355,6 +357,38 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class ParameterConvertersBehaviour {
     }
 
     &amp;lt; at &amp;gt;Test
+    public void shouldConvertMultilineTableToParameters() throws ParseException, IntrospectionException {
+        ParameterConverter converter = new ExamplesTableParametersConverter();
+        Type type = SomeSteps.methodFor("aMethodWithExamplesTableParameters").getGenericParameterTypes()[0];
+        assertThat(converter.accept(type), is(true));
+        assertThat(converter.accept(WrongType.class), is(false));
+        assertThat(converter.accept(mock(Type.class)), is(false));
+        String value = "|col1|col2|\n|row11|row12|\n|row21|row22|\n";
+        &amp;lt; at &amp;gt;SuppressWarnings("unchecked")
+        List&amp;lt;MyParameters&amp;gt; parameters = (List&amp;lt;MyParameters&amp;gt;) converter.convertValue(value, type);
+        assertThat(parameters.size(), equalTo(2));
+        MyParameters row1 = parameters.get(0);
+        assertThat(row1.col1, equalTo("row11"));
+        assertThat(row1.col2, equalTo("row12"));
+        MyParameters row2 = parameters.get(1);
+        assertThat(row2.col1, equalTo("row21"));
+        assertThat(row2.col2, equalTo("row22"));
+    }
+
+    &amp;lt; at &amp;gt;Test
+    public void shouldConvertSinglelineTableToParameters() throws ParseException, IntrospectionException {
+        ParameterConverter converter = new ExamplesTableParametersConverter();
+        Type type = SomeSteps.methodFor("aMethodWithExamplesTableParameter").getGenericParameterTypes()[0];
+        assertThat(converter.accept(type), is(true));
+        assertThat(converter.accept(WrongType.class), is(false));
+        assertThat(converter.accept(mock(Type.class)), is(false));
+        String value = "|col1|col2|\n|row11|row12|\n";
+        MyParameters parameters = (MyParameters) converter.convertValue(value, type);
+        assertThat(parameters.col1, equalTo("row11"));
+        assertThat(parameters.col2, equalTo("row12"));
+    }
+
+    &amp;lt; at &amp;gt;Test
     public void shouldConvertParameterFromMethodReturningValue() throws ParseException, IntrospectionException {
         Method method = SomeSteps.methodFor("aMethodReturningExamplesTable");
         ParameterConverter converter = new MethodReturningConverter(method, new SomeSteps());
diff --git a/jbehave-core/src/test/java/org/jbehave/core/steps/SomeSteps.java b/jbehave-core/src/test/java/org/jbehave/core/steps/SomeSteps.java
index 84161df..018a40c 100755
--- a/jbehave-core/src/test/java/org/jbehave/core/steps/SomeSteps.java
+++ b/jbehave-core/src/test/java/org/jbehave/core/steps/SomeSteps.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -10,6 +10,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import java.util.HashMap;
 import java.util.List;
 import java.util.Set;
 
+import org.jbehave.core.annotations.AsParameters;
 import org.jbehave.core.annotations.BeforeScenario;
 import org.jbehave.core.annotations.Named;
 import org.jbehave.core.failures.PendingStepFound;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -103,6 +104,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class SomeSteps extends Steps {
     return new ExamplesTable(value);
     }
 
+    public void aMethodWithExamplesTableParameter(MyParameters args) {
+        this.args = args;
+    }
+
+    public void aMethodWithExamplesTableParameters(List&amp;lt;MyParameters&amp;gt; args) {
+        this.args = args;
+    }
+
+    &amp;lt; at &amp;gt;AsParameters
+    public static class MyParameters {
+        String col1;
+        String col2;
+        
+    }
+
     public ExamplesTable aFailingMethodReturningExamplesTable(String value){
         throw new RuntimeException(value);
     }



&lt;/pre&gt;</description>
    <dc:creator>Mauro Talevi</dc:creator>
    <dc:date>2013-06-16T17:46:42</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3717">
    <title>[scm-tutorial][1/1] Updated to latest core release.</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3717</link>
    <description>&lt;pre&gt;commit 805d27b250f61d42d21304b696e87ce68506ff29
Author:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Sun, 9 Jun 2013 12:28:20 +0100
Commit:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Sun, 9 Jun 2013 12:28:20 +0100

    Updated to latest core release.

diff --git a/etsy-web-runner/pom.xml b/etsy-web-runner/pom.xml
index 05892e0..61dec5c 100644
--- a/etsy-web-runner/pom.xml
+++ b/etsy-web-runner/pom.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -9,7 +9,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
   &amp;lt;name&amp;gt;Etsy.com Stories Web Runner&amp;lt;/name&amp;gt;
 
   &amp;lt;properties&amp;gt;
-    &amp;lt;jbehave.core.version&amp;gt;3.8-SNAPSHOT&amp;lt;/jbehave.core.version&amp;gt;
+    &amp;lt;jbehave.core.version&amp;gt;3.9-SNAPSHOT&amp;lt;/jbehave.core.version&amp;gt;
     &amp;lt;jbehave.web.version&amp;gt;3.6-SNAPSHOT&amp;lt;/jbehave.web.version&amp;gt;
     &amp;lt;jbehave.site.version&amp;gt;3.1.1&amp;lt;/jbehave.site.version&amp;gt;
     &amp;lt;jbehave.webrunner.name&amp;gt;etsy-stories-runner&amp;lt;/jbehave.webrunner.name&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -26,6 +26,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
       &amp;lt;artifactId&amp;gt;etsy-stories-java-spring&amp;lt;/artifactId&amp;gt;
       &amp;lt;version&amp;gt;${project.version}&amp;lt;/version&amp;gt;
     &amp;lt;/dependency&amp;gt;
+    &amp;lt;dependency&amp;gt;
+      &amp;lt;groupId&amp;gt;org.seleniumhq.selenium.fluent&amp;lt;/groupId&amp;gt;
+      &amp;lt;artifactId&amp;gt;fluent-selenium&amp;lt;/artifactId&amp;gt;
+      &amp;lt;version&amp;gt;1.6.3&amp;lt;/version&amp;gt;
+    &amp;lt;/dependency&amp;gt;
   &amp;lt;/dependencies&amp;gt;
 
   &amp;lt;build&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -40,62 +45,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
             &amp;lt;target&amp;gt;1.5&amp;lt;/target&amp;gt;
           &amp;lt;/configuration&amp;gt;
         &amp;lt;/plugin&amp;gt;
-        &amp;lt;!--This plugin's configuration is used to store Eclipse m2e settings 
-          only. It has no influence on the Maven build itself. --&amp;gt;
-        &amp;lt;plugin&amp;gt;
-          &amp;lt;groupId&amp;gt;org.eclipse.m2e&amp;lt;/groupId&amp;gt;
-          &amp;lt;artifactId&amp;gt;lifecycle-mapping&amp;lt;/artifactId&amp;gt;
-          &amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
-          &amp;lt;configuration&amp;gt;
-            &amp;lt;lifecycleMappingMetadata&amp;gt;
-              &amp;lt;pluginExecutions&amp;gt;
-                &amp;lt;pluginExecution&amp;gt;
-                  &amp;lt;pluginExecutionFilter&amp;gt;
-                    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;
-                    &amp;lt;artifactId&amp;gt;maven-dependency-plugin&amp;lt;/artifactId&amp;gt;
-                    &amp;lt;versionRange&amp;gt;[2.1,)&amp;lt;/versionRange&amp;gt;
-                    &amp;lt;goals&amp;gt;
-                      &amp;lt;goal&amp;gt;copy&amp;lt;/goal&amp;gt;
-                      &amp;lt;goal&amp;gt;unpack&amp;lt;/goal&amp;gt;
-                    &amp;lt;/goals&amp;gt;
-                  &amp;lt;/pluginExecutionFilter&amp;gt;
-                  &amp;lt;action&amp;gt;
-                    &amp;lt;ignore&amp;gt;&amp;lt;/ignore&amp;gt;
-                  &amp;lt;/action&amp;gt;
-                &amp;lt;/pluginExecution&amp;gt;
-                &amp;lt;pluginExecution&amp;gt;
-                  &amp;lt;pluginExecutionFilter&amp;gt;
-                    &amp;lt;groupId&amp;gt;org.jbehave&amp;lt;/groupId&amp;gt;
-                    &amp;lt;artifactId&amp;gt;jbehave-maven-plugin&amp;lt;/artifactId&amp;gt;
-                    &amp;lt;versionRange&amp;gt;[${jbehave.core.version},)&amp;lt;/versionRange&amp;gt;
-                    &amp;lt;goals&amp;gt;
-                      &amp;lt;goal&amp;gt;unpack-view-resources&amp;lt;/goal&amp;gt;
-                    &amp;lt;/goals&amp;gt;
-                  &amp;lt;/pluginExecutionFilter&amp;gt;
-                  &amp;lt;action&amp;gt;
-                    &amp;lt;ignore&amp;gt;&amp;lt;/ignore&amp;gt;
-                  &amp;lt;/action&amp;gt;
-                &amp;lt;/pluginExecution&amp;gt;
-                &amp;lt;pluginExecution&amp;gt;
-                  &amp;lt;pluginExecutionFilter&amp;gt;
-                    &amp;lt;groupId&amp;gt;org.codehaus.gmaven&amp;lt;/groupId&amp;gt;
-                    &amp;lt;artifactId&amp;gt;gmaven-plugin&amp;lt;/artifactId&amp;gt;
-                    &amp;lt;versionRange&amp;gt;[${gmaven.version},)&amp;lt;/versionRange&amp;gt;
-                    &amp;lt;goals&amp;gt;
-                      &amp;lt;goal&amp;gt;generateStubs&amp;lt;/goal&amp;gt;
-                      &amp;lt;goal&amp;gt;compile&amp;lt;/goal&amp;gt;
-                      &amp;lt;goal&amp;gt;generateTestStubs&amp;lt;/goal&amp;gt;
-                      &amp;lt;goal&amp;gt;testCompile&amp;lt;/goal&amp;gt;
-                    &amp;lt;/goals&amp;gt;
-                  &amp;lt;/pluginExecutionFilter&amp;gt;
-                  &amp;lt;action&amp;gt;
-                    &amp;lt;ignore&amp;gt;&amp;lt;/ignore&amp;gt;
-                  &amp;lt;/action&amp;gt;
-                &amp;lt;/pluginExecution&amp;gt;
-              &amp;lt;/pluginExecutions&amp;gt;
-            &amp;lt;/lifecycleMappingMetadata&amp;gt;
-          &amp;lt;/configuration&amp;gt;
-        &amp;lt;/plugin&amp;gt;
       &amp;lt;/plugins&amp;gt;
     &amp;lt;/pluginManagement&amp;gt;
     &amp;lt;plugins&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -175,7 +124,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt;profile&amp;gt;
       &amp;lt;id&amp;gt;stable&amp;lt;/id&amp;gt;
       &amp;lt;properties&amp;gt;
-        &amp;lt;jbehave.core.version&amp;gt;3.7.0&amp;lt;/jbehave.core.version&amp;gt;
+        &amp;lt;jbehave.core.version&amp;gt;3.8.0&amp;lt;/jbehave.core.version&amp;gt;
         &amp;lt;jbehave.web.version&amp;gt;3.5.4&amp;lt;/jbehave.web.version&amp;gt;
       &amp;lt;/properties&amp;gt;
     &amp;lt;/profile&amp;gt;



&lt;/pre&gt;</description>
    <dc:creator>Mauro Talevi</dc:creator>
    <dc:date>2013-06-09T11:28:30</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3716">
    <title>[scm-core][1/1] Updated README.</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3716</link>
    <description>&lt;pre&gt;commit abf3b010074bcd091ebda3094602e5528649bc07
Author:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Mon, 3 Jun 2013 09:27:48 +0200
Commit:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Mon, 3 Jun 2013 09:27:48 +0200

    Updated README.

diff --git a/README.md b/README.md
index 94beb62..4588ded 100755
--- a/README.md
+++ b/README.md
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -10,18 +10,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; JBehave is a BDD framework for Java and Groovy, mirrored [at Github](https://git
 
 Canonical information for JBehave:
 
-1. [News](http://jbehave.org).
-2. [Documentation](http://jbehave.org/documentation/).
+1. [Web Site](http://jbehave.org).
+2. [Stable Reference](http://jbehave.org/reference/stable/).
 3. [User mail-list](http://xircles.codehaus.org/lists/user-b1QraVsTlj/IJWOP8RzEEmD2FQJk+8+b&amp;lt; at &amp;gt;public.gmane.org)
-4. Jars in [Maven Repositories](http://mvnrepository.com/search.html?query=jbehave)
+4. [Search Maven](http://search.maven.org/#search|ga|1|jbehave)
 
 ## Contributing and Developing
 
-Please report issues, feature requests on the Codehaus [issue
-tracker](http://jira.codehaus.org/browse/JBEHAVE) or discuss them on the
+Please report issues, feature requests on the Codehaus [JIRA](http://jira.codehaus.org/browse/JBEHAVE) or discuss them on the
 [dev mail-list](http://xircles.codehaus.org/lists/dev-b1QraVsTlj8bljKkefex1g&amp;lt; at &amp;gt;public.gmane.orgaus.org).
 
-Keep an eye on the  [Bamboo Continuous Integration](http://bamboo.ci.codehaus.org/browse/JBEHAVE) server for JBehave builds.
+Keep an eye on the  [Travis CI](http://travis-ci.org/jbehave/jbehave-core) server for JBehave builds.
 
 ### JDK
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -59,7 +58,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; After that, it is necessary to only do the following:
 
 - default: builds all releasable modules
 - examples: builds all headless examples
&lt;/pre&gt;</description>
    <dc:creator>Mauro Talevi</dc:creator>
    <dc:date>2013-06-03T07:27:58</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3715">
    <title>[scm-site][1/1] Added README.</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3715</link>
    <description>&lt;pre&gt;commit 44c0311ad009e3789b94166c5081a735de05e4fb
Author:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Mon, 3 Jun 2013 09:21:03 +0200
Commit:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Mon, 3 Jun 2013 09:21:03 +0200

    Added README.

diff --git a/README.md b/README.md
new file mode 100755
index 0000000..3f1806d
--- /dev/null
+++ b/README.md
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+[![Build Status](https://travis-ci.org/jbehave/jbehave-site.png)](https://travis-ci.org/jbehave/jbehave-site)
+
+# JBehave Site
+
+JBehave Site contains the static web site content of [jbehave.org](http://jbehave.org) as well as resources used by other JBehave projects, notably Core and Web.
+
+## Contributing and Developing
+
+Please report issues, feature requests on the Codehaus [issue
+tracker](http://jira.codehaus.org/browse/JBEHAVE) or discuss them on the
+[dev mail-list](http://xircles.codehaus.org/lists/dev-b1QraVsTlj/QBdX0F7c5Mg&amp;lt; at &amp;gt;public.gmane.orgs.org).
+
+Keep an eye on the  [Travis Continuous Integration](http://travis-ci.org/jbehave/jbehave) server for JBehave builds.
+
+## License
+
+See LICENSE.txt in the source root (BSD).



&lt;/pre&gt;</description>
    <dc:creator>Mauro Talevi</dc:creator>
    <dc:date>2013-06-03T07:21:11</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3714">
    <title>[scm-site][1/1] Updated scripts.  Added travis config.</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3714</link>
    <description>&lt;pre&gt;commit 4fe13c5ff04dd32c3e133a93d9a6d3b2d9a8a3f4
Author:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Mon, 3 Jun 2013 09:11:45 +0200
Commit:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Mon, 3 Jun 2013 09:11:45 +0200

    Updated scripts.  Added travis config.

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..8a0f52d
--- /dev/null
+++ b/.travis.yml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+language: java
+env: MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=128m"
+install: /bin/true
+script: mvn clean install | grep -v -E "Download(ed|ing)"
+jdk:
+  - openjdk6
+  - openjdk7
+  - oraclejdk7
diff --git a/release.sh b/release.sh
index c6fd2c9..f18e13c 100755
--- a/release.sh
+++ b/release.sh
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -27,8 +27,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; if [ "$NAME" == "" ] || [ "$VERSION" == "" ] || [ "$QUALIFIER" == "" ] || [ "$NE
   exit;
 fi
 
-mvn --batch-mode release:prepare -Preporting,distribution -DreleaseVersion=$VERSION -Dtag=$NAME-$VERSION -DdevelopmentVersion=$NEXT 
-mvn release:perform -Preporting,distribution
+PROFILES=atlassian,jenkins,reporting,distribution
+mvn --batch-mode release:prepare -P$PROFILES -DreleaseVersion=$VERSION -Dtag=$NAME-$VERSION -DdevelopmentVersion=$NEXT 
+mvn release:perform -P$PROFILES
 
 CWD=`pwd`
 cd $CWD/../jbehave-site/site-upload
diff --git a/snapshot.sh b/snapshot.sh
index 6931f01..3062443 100755
--- a/snapshot.sh
+++ b/snapshot.sh
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -10,7 +10,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; if [ "$NAME" == "" ] || [ "$VERSION" == "" ]; then
   exit;
 fi
 
-mvn clean deploy -Preporting,distribution
+mvn -U clean deploy -Preporting,distribution
 
 CWD=`pwd`
 cd $CWD/../jbehave-site/site-upload



&lt;/pre&gt;</description>
    <dc:creator>Mauro Talevi</dc:creator>
    <dc:date>2013-06-03T07:11:55</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3713">
    <title>[scm-core][15/15] JBEHAVE-899 Added needle module</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3713</link>
    <description>&lt;pre&gt;commit 82d8b6b87048246ebddc9119bfcac5c048e67216
Merge: 04159e0 c4aa030
Author:     Mauro Talevi &amp;lt;mauro.talevi-hQ+s5KbX5YmGglJvpFV4uA&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Sun, 2 Jun 2013 11:31:38 +0200
Commit:     Mauro Talevi &amp;lt;mauro.talevi&amp;lt; at &amp;gt;aquilonia.org&amp;gt;
CommitDate: Sun, 2 Jun 2013 11:31:38 +0200

    JBEHAVE-899 Added needle module

diff --cc examples/core/src/main/java/org/jbehave/examples/core/steps/TraderSteps.java
index 5c1a901,0000000..b3f5cad
mode 100755,000000..100755
--- a/examples/core/src/main/java/org/jbehave/examples/core/steps/TraderSteps.java
+++ b/examples/core/src/main/java/org/jbehave/examples/core/steps/TraderSteps.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,200 -1,0 +1,209 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 +package org.jbehave.examples.core.steps;
 +
 +import java.util.ArrayList;
 +import java.util.Calendar;
 +import java.util.Collections;
 +import java.util.Date;
 +import java.util.List;
 +import java.util.Map;
 +
 +import org.jbehave.core.annotations.Alias;
 +import org.jbehave.core.annotations.Aliases;
 +import org.jbehave.core.annotations.AsParameterConverter;
 +import org.jbehave.core.annotations.Given;
 +import org.jbehave.core.annotations.Named;
 +import org.jbehave.core.annotations.Then;
 +import org.jbehave.core.annotations.When;
 +import org.jbehave.core.model.ExamplesTable;
 +import org.jbehave.core.model.OutcomesTable;
 +import org.jbehave.core.steps.CandidateSteps;
 +import org.jbehave.core.steps.InstanceStepsFactory;
 +import org.jbehave.core.steps.Parameters;
 +import org.jbehave.examples.core.CoreStory;
 +import org.jbehave.examples.core.model.Stock;
 +import org.jbehave.examples.core.model.Trader;
 +import org.jbehave.examples.core.model.Stock.AlertStatus;
 +import org.jbehave.examples.core.persistence.TraderPersister;
 +import org.jbehave.examples.core.service.TradingService;
 +
 +import static java.util.Arrays.asList;
 +
 +import static org.hamcrest.MatcherAssert.assertThat;
 +
 +import static org.hamcrest.Matchers.equalTo;
 +
 +/**
 + * POJO holding the candidate steps for the trader example.  
 + * The {&amp;lt; at &amp;gt;link CandidateSteps} instance wrapping this are created via the {&amp;lt; at &amp;gt;link InstanceStepsFactory}
 + * in the {&amp;lt; at &amp;gt;link CoreStory}.
 + */
 +public class TraderSteps {
 +
-     private TradingService service;    
-     private Stock stock;
-     private Trader trader;
-     private List&amp;lt;Trader&amp;gt; traders = new ArrayList&amp;lt;Trader&amp;gt;();
-     private List&amp;lt;Trader&amp;gt; searchedTraders;
++private TradingService service;
++private Stock stock;
++private Trader trader;
++private List&amp;lt;Trader&amp;gt; traders = new ArrayList&amp;lt;Trader&amp;gt;();
++private List&amp;lt;Trader&amp;gt; searchedTraders;
 +private Date date;
-     private ExamplesTable ranksTable;
-     private String stockExchange;
-     private String assetClass;
-       
++private ExamplesTable ranksTable;
++private String stockExchange;
++private String assetClass;
++
 +public TraderSteps() {
 +this(new TradingService());
 +}
- 
-     public TraderSteps(TradingService service) {
-         this.service = service;
-     }
 +
-     &amp;lt; at &amp;gt;Given("a date of %date")
-     public void aDate(Date date) {
++public TraderSteps(TradingService service) {
++this.service = service;
++}
++
++public TradingService getService() {
++return this.service;
++}
++
++&amp;lt; at &amp;gt;Given("a date of %date")
++public void aDate(Date date) {
 +this.date = date;
-     }
-     
-     &amp;lt; at &amp;gt;When("%days days pass")
-     public void daysPass(int days) {
++}
++
++&amp;lt; at &amp;gt;When("%days days pass")
++public void daysPass(int days) {
 +Calendar calendar = Calendar.getInstance();
 +calendar.setTime(date);
 +calendar.add(Calendar.DAY_OF_YEAR, days);
 +date = calendar.getTime();
-     }
++}
 +
-     &amp;lt; at &amp;gt;Then("the date is %date")
-     public void theDate(Date date) {
++&amp;lt; at &amp;gt;Then("the date is %date")
++public void theDate(Date date) {
 +assertThat(date, equalTo(this.date));
-     }
- 
-     &amp;lt; at &amp;gt;Given("a trader of {name|id} %trader")
-     public void aTrader(Trader trader) {
-         this.trader = trader;
-     }
- 
-     &amp;lt; at &amp;gt;Given("the trader ranks: %ranksTable")
-     &amp;lt; at &amp;gt;Alias("the traders: %ranksTable")
-     public void theTraderRanks(ExamplesTable ranksTable) {
-         this.ranksTable = ranksTable;
-         traders.clear();
-         traders.addAll(toTraders(ranksTable));
-     }
-     
-     &amp;lt; at &amp;gt;When("traders are subset to \"%regex\" by name")
-     &amp;lt; at &amp;gt;Alias("traders are filtered by \"%regex\"")
-     public void subsetTradersByName(String regex) {
-         searchedTraders = new ArrayList&amp;lt;Trader&amp;gt;();
-         for (Trader trader : traders) {
-             if ( trader.getName().matches(regex) ){
-                 searchedTraders.add(trader);
-             }
-         }
-     }
- 
-     &amp;lt; at &amp;gt;Then("the current trader activity is: %activityTable")
-     public void theTradersActivityIs(ExamplesTable activityTable) {
-         for (int i = 0; i &amp;lt; activityTable.getRowCount(); i++) {
-             Parameters row = activityTable.withDefaults(this.ranksTable.getRowAsParameters(i)).getRowAsParameters(i);
-             System.out.println(row.valueAs("name", Trader.class).getName() + " ("+row.valueAs("rank", String.class, "N/A")+") has done " + row.valueAs("trades", Integer.class) + " trades");            
-         }
-     }
- 
-     &amp;lt; at &amp;gt;Then("the traders returned are: %tradersTable")
-     public void theTradersReturnedAre(ExamplesTable tradersTable) {
-         OutcomesTable outcomes = new OutcomesTable();
-         outcomes.addOutcome("traders", searchedTraders.toString(), equalTo(toTraders(tradersTable).toString()));
-         outcomes.addOutcome("a success", "Any Value", equalTo("Any Value"));
-         outcomes.verify();
-     }
- 
-     private List&amp;lt;Trader&amp;gt; toTraders(ExamplesTable table) {
-         List&amp;lt;Trader&amp;gt; traders = new ArrayList&amp;lt;Trader&amp;gt;();
-         List&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt; rows = table.getRows();
-         for (Map&amp;lt;String, String&amp;gt; row : rows) {
-             String name = row.get("name");
-             String rank = row.get("rank");
-             traders.add(service.newTrader(name, rank));
-         }
-         Collections.sort(traders);
-         return traders;
-     }
-     
-     &amp;lt; at &amp;gt;Given("the stock exchange %stockExchange")
-     &amp;lt; at &amp;gt;Alias("the stock exchange &amp;lt;stockExchange&amp;gt;")    
-     public void theStockExchange(&amp;lt; at &amp;gt;Named("stockExchange") String stockExchange) {
-         this.stockExchange = stockExchange;        
-     }
- 
-     &amp;lt; at &amp;gt;Given("the asset class %assetClass")
-     &amp;lt; at &amp;gt;Alias("the asset class &amp;lt;assetClass&amp;gt;")    
-     public void theAssetClass(&amp;lt; at &amp;gt;Named("assetClass") String assetClass) {
-         this.assetClass = assetClass;
-     }
- 
-     &amp;lt; at &amp;gt;Given("a stock of symbol %symbol and a threshold of %threshold")
-     &amp;lt; at &amp;gt;Alias("a stock of &amp;lt;symbol&amp;gt; and a &amp;lt;threshold&amp;gt;") // alias used with examples table
-     public void aStock(&amp;lt; at &amp;gt;Named("symbol") String symbol, &amp;lt; at &amp;gt;Named("threshold") double threshold) {
-         stock = service.newStock(symbol, threshold);
-     }
- 
-     &amp;lt; at &amp;gt;When("the stock is traded at price %price")
-     &amp;lt; at &amp;gt;Aliases(values={"the stock is sold at price %price", "the stock is exchanged at price %price",
-             "the stock is traded with &amp;lt;price&amp;gt;"}) // multiple aliases, one used with examples table
-     public void theStockIsTraded(&amp;lt; at &amp;gt;Named("price") double price) {
-         stock.tradeAt(price);
-     }
- 
-     &amp;lt; at &amp;gt;Given("the alert status is %status") // shows that matching pattern need only be unique for step type
-     public void theAlertStatusIsReset(&amp;lt; at &amp;gt;Named("status") String status) {
-     if ( AlertStatus.OFF.name().startsWith(status) &amp;amp;&amp;amp; stock != null ){
-         stock.resetAlert();    
-     }
-     }
- 
-     &amp;lt; at &amp;gt;Then("the alert status is %status")
-     &amp;lt; at &amp;gt;Alias("the trader is alerted with &amp;lt;status&amp;gt;") // alias used with examples table
-     public void theAlertStatusIs(&amp;lt; at &amp;gt;Named("status") String status) {
-         assertThat(stock.getStatus().name(), equalTo(status));
-     }
- 
-     &amp;lt; at &amp;gt;Then(value="the alert status is currently %status", priority=1) // prioritise over potential match with previous method
-     public void theAlertStatusIsCurrently(&amp;lt; at &amp;gt;Named("status") String status) {
-         assertThat(stock.getStatus().name(), equalTo(status));
-     }    
-     
-     &amp;lt; at &amp;gt;When("the trader sells all stocks")
-     public void theTraderSellsAllStocks() {
-         trader.sellAllStocks();
-     }
- 
-     &amp;lt; at &amp;gt;Then("the trader is left with no stocks")
-     public void theTraderIsLeftWithNoStocks() {
-         assertThat(trader.getStocks().size(), equalTo(0));
-     }
-     
-     // Method used as dynamical parameter converter
-     &amp;lt; at &amp;gt;AsParameterConverter
-     public Trader retrieveTrader(String name){
-         for (Trader trader : traders) {
-             if ( trader.getName().equals(name)){
-                 return trader;
-             }
-         }
-     return mockTradePersister().retrieveTrader(name);
-     }
-     
- static TraderPersister mockTradePersister() {
- return new TraderPersister(new Trader("Mauro", asList(new Stock("STK1",
- 10.d))));
 +}
 +
++&amp;lt; at &amp;gt;Given("a trader of {name|id} %trader")
++public void aTrader(Trader trader) {
++this.trader = trader;
++}
++
++&amp;lt; at &amp;gt;Given("the trader ranks: %ranksTable")
++&amp;lt; at &amp;gt;Alias("the traders: %ranksTable")
++public void theTraderRanks(ExamplesTable ranksTable) {
++this.ranksTable = ranksTable;
++traders.clear();
++traders.addAll(toTraders(ranksTable));
++}
++
++&amp;lt; at &amp;gt;When("traders are subset to \"%regex\" by name")
++&amp;lt; at &amp;gt;Alias("traders are filtered by \"%regex\"")
++public void subsetTradersByName(String regex) {
++searchedTraders = new ArrayList&amp;lt;Trader&amp;gt;();
++for (Trader trader : traders) {
++if (trader.getName().matches(regex)) {
++searchedTraders.add(trader);
++}
++}
++}
++
++&amp;lt; at &amp;gt;Then("the current trader activity is: %activityTable")
++public void theTradersActivityIs(ExamplesTable activityTable) {
++for (int i = 0; i &amp;lt; activityTable.getRowCount(); i++) {
++Parameters row = activityTable.withDefaults(this.ranksTable.getRowAsParameters(i)).getRowAsParameters(i);
++System.out.println(row.valueAs("name", Trader.class).getName() + " ("
+++ row.valueAs("rank", String.class, "N/A") + ") has done " + row.valueAs("trades", Integer.class)
+++ " trades");
++}
++}
++
++&amp;lt; at &amp;gt;Then("the traders returned are: %tradersTable")
++public void theTradersReturnedAre(ExamplesTable tradersTable) {
++OutcomesTable outcomes = new OutcomesTable();
++outcomes.addOutcome("traders", searchedTraders.toString(), equalTo(toTraders(tradersTable).toString()));
++outcomes.addOutcome("a success", "Any Value", equalTo("Any Value"));
++outcomes.verify();
++}
++
++private List&amp;lt;Trader&amp;gt; toTraders(ExamplesTable table) {
++List&amp;lt;Trader&amp;gt; traders = new ArrayList&amp;lt;Trader&amp;gt;();
++List&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt; rows = table.getRows();
++for (Map&amp;lt;String, String&amp;gt; row : rows) {
++String name = row.get("name");
++String rank = row.get("rank");
++traders.add(getService().newTrader(name, rank));
++}
++Collections.sort(traders);
++return traders;
++}
++
++&amp;lt; at &amp;gt;Given("the stock exchange %stockExchange")
++&amp;lt; at &amp;gt;Alias("the stock exchange &amp;lt;stockExchange&amp;gt;")
++public void theStockExchange(&amp;lt; at &amp;gt;Named("stockExchange") String stockExchange) {
++this.stockExchange = stockExchange;
++}
++
++&amp;lt; at &amp;gt;Given("the asset class %assetClass")
++&amp;lt; at &amp;gt;Alias("the asset class &amp;lt;assetClass&amp;gt;")
++public void theAssetClass(&amp;lt; at &amp;gt;Named("assetClass") String assetClass) {
++this.assetClass = assetClass;
++}
++
++&amp;lt; at &amp;gt;Given("a stock of symbol %symbol and a threshold of %threshold")
++&amp;lt; at &amp;gt;Alias("a stock of &amp;lt;symbol&amp;gt; and a &amp;lt;threshold&amp;gt;")
++// alias used with examples table
++public void aStock(&amp;lt; at &amp;gt;Named("symbol") String symbol, &amp;lt; at &amp;gt;Named("threshold") double threshold) {
++stock = getService().newStock(symbol, threshold);
++}
++
++&amp;lt; at &amp;gt;When("the stock is traded at price %price")
++&amp;lt; at &amp;gt;Aliases(values = { "the stock is sold at price %price", "the stock is exchanged at price %price",
++"the stock is traded with &amp;lt;price&amp;gt;" })
++// multiple aliases, one used with examples table
++public void theStockIsTraded(&amp;lt; at &amp;gt;Named("price") double price) {
++stock.tradeAt(price);
++}
++
++&amp;lt; at &amp;gt;Given("the alert status is %status")
++// shows that matching pattern need only be unique for step type
++public void theAlertStatusIsReset(&amp;lt; at &amp;gt;Named("status") String status) {
++if (AlertStatus.OFF.name().startsWith(status) &amp;amp;&amp;amp; stock != null) {
++stock.resetAlert();
++}
++}
++
++&amp;lt; at &amp;gt;Then("the alert status is %status")
++&amp;lt; at &amp;gt;Alias("the trader is alerted with &amp;lt;status&amp;gt;")
++// alias used with examples table
++public void theAlertStatusIs(&amp;lt; at &amp;gt;Named("status") String status) {
++assertThat(stock.getStatus().name(), equalTo(status));
++}
++
++&amp;lt; at &amp;gt;Then(value = "the alert status is currently %status", priority = 1)
++// prioritise over potential match with previous method
++public void theAlertStatusIsCurrently(&amp;lt; at &amp;gt;Named("status") String status) {
++assertThat(stock.getStatus().name(), equalTo(status));
++}
++
++&amp;lt; at &amp;gt;When("the trader sells all stocks")
++public void theTraderSellsAllStocks() {
++trader.sellAllStocks();
++}
++
++&amp;lt; at &amp;gt;Then("the trader is left with no stocks")
++public void theTraderIsLeftWithNoStocks() {
++assertThat(trader.getStocks().size(), equalTo(0));
++}
++
++// Method used as dynamical parameter converter
++&amp;lt; at &amp;gt;AsParameterConverter
++public Trader retrieveTrader(String name) {
++for (Trader trader : traders) {
++if (trader.getName().equals(name)) {
++return trader;
++}
++}
++return mockTradePersister().retrieveTrader(name);
++}
++
++static TraderPersister mockTradePersister() {
++return new TraderPersister(new Trader("Mauro", asList(new Stock("STK1", 10.d))));
++}
 +
 +}
diff --cc examples/needle/pom.xml
index 0000000,0000000..0fd5131
new file mode 100644
--- /dev/null
+++ b/examples/needle/pom.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,0 -1,0 +1,65 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
++&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
++xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;
++&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
++&amp;lt;parent&amp;gt;
++&amp;lt;groupId&amp;gt;org.jbehave&amp;lt;/groupId&amp;gt;
++&amp;lt;artifactId&amp;gt;jbehave-examples&amp;lt;/artifactId&amp;gt;
++&amp;lt;version&amp;gt;3.9-SNAPSHOT&amp;lt;/version&amp;gt;
++&amp;lt;/parent&amp;gt;
++&amp;lt;artifactId&amp;gt;jbehave-needle-example&amp;lt;/artifactId&amp;gt;
++&amp;lt;name&amp;gt;JBehave Needle Example&amp;lt;/name&amp;gt;
++
++&amp;lt;dependencies&amp;gt;
++&amp;lt;dependency&amp;gt;
++&amp;lt;groupId&amp;gt;org.jbehave&amp;lt;/groupId&amp;gt;
++&amp;lt;artifactId&amp;gt;jbehave-core-example&amp;lt;/artifactId&amp;gt;
++&amp;lt;version&amp;gt;${project.version}&amp;lt;/version&amp;gt;
++&amp;lt;/dependency&amp;gt;
++&amp;lt;dependency&amp;gt;
++&amp;lt;groupId&amp;gt;org.jbehave&amp;lt;/groupId&amp;gt;
++&amp;lt;artifactId&amp;gt;jbehave-needle&amp;lt;/artifactId&amp;gt;
++&amp;lt;version&amp;gt;${project.version}&amp;lt;/version&amp;gt;
++&amp;lt;/dependency&amp;gt;
++        &amp;lt;dependency&amp;gt;
++            &amp;lt;groupId&amp;gt;org.easymock&amp;lt;/groupId&amp;gt;
++            &amp;lt;artifactId&amp;gt;easymock&amp;lt;/artifactId&amp;gt;
++            &amp;lt;version&amp;gt;3.1&amp;lt;/version&amp;gt;
++        &amp;lt;/dependency&amp;gt;    
++&amp;lt;dependency&amp;gt;
++&amp;lt;groupId&amp;gt;javax.inject&amp;lt;/groupId&amp;gt;
++&amp;lt;artifactId&amp;gt;javax.inject&amp;lt;/artifactId&amp;gt;
++&amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;
++&amp;lt;/dependency&amp;gt;
++&amp;lt;dependency&amp;gt;
++  &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
++  &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;
++  &amp;lt;version&amp;gt;1.7.5&amp;lt;/version&amp;gt;
++  &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
++&amp;lt;/dependency&amp;gt;
++&amp;lt;/dependencies&amp;gt;
++
++&amp;lt;build&amp;gt;
++&amp;lt;plugins&amp;gt;
++&amp;lt;plugin&amp;gt;
++&amp;lt;groupId&amp;gt;org.jbehave&amp;lt;/groupId&amp;gt;
++&amp;lt;artifactId&amp;gt;jbehave-maven-plugin&amp;lt;/artifactId&amp;gt;
++&amp;lt;executions&amp;gt;
++&amp;lt;execution&amp;gt;
++&amp;lt;id&amp;gt;embeddable-stories&amp;lt;/id&amp;gt;
++&amp;lt;phase&amp;gt;integration-test&amp;lt;/phase&amp;gt;
++&amp;lt;configuration&amp;gt;
++&amp;lt;includes&amp;gt;
++&amp;lt;include&amp;gt;**/CoreStoriesUsingNeedle.java&amp;lt;/include&amp;gt;
++&amp;lt;/includes&amp;gt;
++&amp;lt;ignoreFailureInStories&amp;gt;true&amp;lt;/ignoreFailureInStories&amp;gt;
++&amp;lt;ignoreFailureInView&amp;gt;true&amp;lt;/ignoreFailureInView&amp;gt;
++&amp;lt;/configuration&amp;gt;
++&amp;lt;goals&amp;gt;
++&amp;lt;goal&amp;gt;run-stories-as-embeddables&amp;lt;/goal&amp;gt;
++&amp;lt;/goals&amp;gt;
++&amp;lt;/execution&amp;gt;
++&amp;lt;/executions&amp;gt;
++&amp;lt;/plugin&amp;gt;
++&amp;lt;/plugins&amp;gt;
++&amp;lt;/build&amp;gt;
++&amp;lt;/project&amp;gt;
diff --cc examples/needle/src/main/java/org/jbehave/examples/core/needle/AnnotatedEmbedderUsingNeedle.java
index 0000000,0000000..eb52692
new file mode 100644
--- /dev/null
+++ b/examples/needle/src/main/java/org/jbehave/examples/core/needle/AnnotatedEmbedderUsingNeedle.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,0 -1,0 +1,37 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
++package org.jbehave.examples.core.needle;
++
++import static org.jbehave.core.io.CodeLocations.codeLocationFromPath;
++
++import java.util.List;
++
++import org.jbehave.core.InjectableEmbedder;
++import org.jbehave.core.annotations.Configure;
++import org.jbehave.core.annotations.UsingEmbedder;
++import org.jbehave.core.annotations.needle.UsingNeedle;
++import org.jbehave.core.embedder.Embedder;
++import org.jbehave.core.io.StoryFinder;
++import org.jbehave.core.junit.needle.NeedleAnnotatedEmbedderRunner;
++import org.junit.Test;
++import org.junit.runner.RunWith;
++
++/**
++ * Run stories via annotated embedder configuration and steps using needle. The textual trader stories are exactly the
++ * same ones found in the jbehave-trader-example. Here we are only concerned with using the container to compose the
++ * configuration and the steps instances.
++ */
++&amp;lt; at &amp;gt;RunWith(NeedleAnnotatedEmbedderRunner.class)
++&amp;lt; at &amp;gt;Configure
++&amp;lt; at &amp;gt;UsingNeedle
++&amp;lt; at &amp;gt;UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = true, ignoreFailureInView = true)
++public class AnnotatedEmbedderUsingNeedle extends InjectableEmbedder {
++
++&amp;lt; at &amp;gt;Test
++public void run() {
++injectedEmbedder().runStoriesAsPaths(storyPaths());
++}
++
++protected List&amp;lt;String&amp;gt; storyPaths() {
++return new StoryFinder().findPaths(codeLocationFromPath("../trader/src/main/java"), "**/*.story", "");
++}
++
++}
diff --cc examples/needle/src/main/java/org/jbehave/examples/core/needle/AnnotatedEmbedderUsingNeedleAndSteps.java
index 0000000,0000000..9f9cdab
new file mode 100644
--- /dev/null
+++ b/examples/needle/src/main/java/org/jbehave/examples/core/needle/AnnotatedEmbedderUsingNeedleAndSteps.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,0 -1,0 +1,47 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
++package org.jbehave.examples.core.needle;
++
++import java.util.List;
++
++import org.jbehave.core.InjectableEmbedder;
++import org.jbehave.core.annotations.Configure;
++import org.jbehave.core.annotations.UsingEmbedder;
++import org.jbehave.core.annotations.UsingSteps;
++import org.jbehave.core.annotations.needle.UsingNeedle;
++import org.jbehave.core.embedder.Embedder;
++import org.jbehave.core.io.StoryFinder;
++import org.jbehave.core.junit.needle.NeedleAnnotatedEmbedderRunner;
++import org.jbehave.examples.core.needle.steps.NeedleTraderSteps;
++import org.jbehave.examples.core.steps.AndSteps;
++import org.jbehave.examples.core.steps.BeforeAfterSteps;
++import org.jbehave.examples.core.steps.CalendarSteps;
++import org.jbehave.examples.core.steps.PendingSteps;
++import org.jbehave.examples.core.steps.PriorityMatchingSteps;
++import org.jbehave.examples.core.steps.SandpitSteps;
++import org.junit.Test;
++import org.junit.runner.RunWith;
++
++import static org.jbehave.core.io.CodeLocations.codeLocationFromPath;
++
++/**
++ * Run stories via annotated embedder configuration and steps using Needle. The textual trader stories are exactly the
++ * same ones found in the jbehave-trader-example. Here we are only concerned with using the container to compose the
++ * configuration and the steps instances.
++ */
++&amp;lt; at &amp;gt;RunWith(NeedleAnnotatedEmbedderRunner.class)
++&amp;lt; at &amp;gt;Configure()
++&amp;lt; at &amp;gt;UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = true, ignoreFailureInView = true)
++&amp;lt; at &amp;gt;UsingSteps(instances = { NeedleTraderSteps.class, BeforeAfterSteps.class, AndSteps.class, CalendarSteps.class,
++PendingSteps.class, PriorityMatchingSteps.class, SandpitSteps.class })
++&amp;lt; at &amp;gt;UsingNeedle
++public class AnnotatedEmbedderUsingNeedleAndSteps extends InjectableEmbedder {
++
++&amp;lt; at &amp;gt;Test
++public void run() {
++injectedEmbedder().runStoriesAsPaths(storyPaths());
++}
++
++protected List&amp;lt;String&amp;gt; storyPaths() {
++return new StoryFinder().findPaths(codeLocationFromPath("../trader/src/main/java"), "**/*.story", "");
++}
++
++}
diff --cc examples/needle/src/main/java/org/jbehave/examples/core/needle/AnnotatedPathRunnerUsingNeedle.java
index 0000000,0000000..a83da28
new file mode 100644
--- /dev/null
+++ b/examples/needle/src/main/java/org/jbehave/examples/core/needle/AnnotatedPathRunnerUsingNeedle.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,0 -1,0 +1,24 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
++package org.jbehave.examples.core.needle;
++
++import org.jbehave.core.annotations.Configure;
++import org.jbehave.core.annotations.UsingEmbedder;
++import org.jbehave.core.annotations.UsingPaths;
++import org.jbehave.core.annotations.needle.UsingNeedle;
++import org.jbehave.core.embedder.Embedder;
++import org.jbehave.core.junit.needle.NeedleAnnotatedPathRunner;
++import org.junit.runner.RunWith;
++
++/**
++ * Run stories via annotated embedder configuration and steps using Needle. The
++ * textual trader stories are exactly the same ones found in the
++ * jbehave-trader-example. Here we are only concerned with using the container
++ * to compose the configuration and the steps instances.
++ */
++&amp;lt; at &amp;gt;RunWith(NeedleAnnotatedPathRunner.class)
++&amp;lt; at &amp;gt;Configure
++&amp;lt; at &amp;gt;UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = true, ignoreFailureInView = true)
++&amp;lt; at &amp;gt;UsingNeedle
++&amp;lt; at &amp;gt;UsingPaths(searchIn = "../trader/src/main/java", includes = { "**/*.story" }, excludes = { "**/examples_table*.story" })
++public class AnnotatedPathRunnerUsingNeedle {
++
++}
diff --cc examples/needle/src/main/java/org/jbehave/examples/core/needle/CoreStoriesUsingNeedle.java
index 0000000,0000000..699eb82
new file mode 100644
--- /dev/null
+++ b/examples/needle/src/main/java/org/jbehave/examples/core/needle/CoreStoriesUsingNeedle.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,0 -1,0 +1,47 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
++package org.jbehave.examples.core.needle;
++
++import java.util.HashSet;
++import java.util.List;
++import java.util.Set;
++
++import org.jbehave.core.io.StoryFinder;
++import org.jbehave.core.steps.InjectableStepsFactory;
++import org.jbehave.core.steps.needle.NeedleStepsFactory;
++import org.jbehave.examples.core.CoreStories;
++import org.jbehave.examples.core.needle.provider.TraderServiceInjectionProvider;
++import org.jbehave.examples.core.needle.steps.NeedleTraderSteps;
++import org.jbehave.examples.core.steps.AndSteps;
++import org.jbehave.examples.core.steps.BeforeAfterSteps;
++import org.jbehave.examples.core.steps.CalendarSteps;
++import org.jbehave.examples.core.steps.PendingSteps;
++import org.jbehave.examples.core.steps.PriorityMatchingSteps;
++import org.jbehave.examples.core.steps.SandpitSteps;
++import org.jbehave.examples.core.steps.SearchSteps;
++
++import de.akquinet.jbosscc.needle.injection.InjectionProvider;
++import static org.jbehave.core.io.CodeLocations.codeLocationFromPath;
++
++/**
++ * Run core stories using NeedleStepsFactory. The textual trader stories are
++ * exactly the same ones found in the jbehave-core-example. Here we are only
++ * concerned with using the container to compose the steps instances.
++ */
++public class CoreStoriesUsingNeedle extends CoreStories {
++
++  &amp;lt; at &amp;gt;Override
++  public InjectableStepsFactory stepsFactory() {
++    final Class&amp;lt;?&amp;gt;[] steps = new Class&amp;lt;?&amp;gt;[] { NeedleTraderSteps.class, BeforeAfterSteps.class, AndSteps.class, CalendarSteps.class, PendingSteps.class,
++        PriorityMatchingSteps.class, SandpitSteps.class, SearchSteps.class };
++
++    final Set&amp;lt;InjectionProvider&amp;lt;?&amp;gt;&amp;gt; providers = new HashSet&amp;lt;InjectionProvider&amp;lt;?&amp;gt;&amp;gt;();
++    providers.add(new TraderServiceInjectionProvider());
++
++    return new NeedleStepsFactory(configuration(), providers, steps);
++  }
++
++  &amp;lt; at &amp;gt;Override
++  protected List&amp;lt;String&amp;gt; storyPaths() {
++    return new StoryFinder().findPaths(codeLocationFromPath("../core/src/main/java"), "**/*.story", "");
++  }
++
++}
diff --cc examples/needle/src/main/java/org/jbehave/examples/core/needle/InheritingAnnotatedEmbedderUsingSteps.java
index 0000000,0000000..1c5b616
new file mode 100644
--- /dev/null
+++ b/examples/needle/src/main/java/org/jbehave/examples/core/needle/InheritingAnnotatedEmbedderUsingSteps.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,0 -1,0 +1,34 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
++package org.jbehave.examples.core.needle;
++
++import java.util.List;
++
++import org.jbehave.core.annotations.UsingSteps;
++import org.jbehave.core.io.StoryFinder;
++import org.jbehave.examples.core.needle.steps.NeedleTraderSteps;
++import org.jbehave.examples.core.steps.AndSteps;
++import org.jbehave.examples.core.steps.BeforeAfterSteps;
++import org.jbehave.examples.core.steps.CalendarSteps;
++import org.jbehave.examples.core.steps.PendingSteps;
++import org.jbehave.examples.core.steps.PriorityMatchingSteps;
++import org.jbehave.examples.core.steps.SandpitSteps;
++import org.junit.Test;
++
++import static org.jbehave.core.io.CodeLocations.codeLocationFromPath;
++
++/**
++ * Here we show how configuation annotations can be split across parent-child hierarchies
++ */
++&amp;lt; at &amp;gt;UsingSteps(instances = { NeedleTraderSteps.class, BeforeAfterSteps.class, AndSteps.class, CalendarSteps.class,
++PendingSteps.class, PriorityMatchingSteps.class, SandpitSteps.class })
++public class InheritingAnnotatedEmbedderUsingSteps extends ParentAnnotatedEmbedderUsingNeedle {
++
++&amp;lt; at &amp;gt;Test
++public void run() {
++injectedEmbedder().runStoriesAsPaths(storyPaths());
++}
++
++protected List&amp;lt;String&amp;gt; storyPaths() {
++return new StoryFinder().findPaths(codeLocationFromPath("../trader/src/main/java"), "**/*.story", "");
++}
++
++}
diff --cc examples/needle/src/main/java/org/jbehave/examples/core/needle/ParentAnnotatedEmbedderUsingNeedle.java
index 0000000,0000000..007647d
new file mode 100644
--- /dev/null
+++ b/examples/needle/src/main/java/org/jbehave/examples/core/needle/ParentAnnotatedEmbedderUsingNeedle.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,0 -1,0 +1,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
++package org.jbehave.examples.core.needle;
++
++import org.jbehave.core.InjectableEmbedder;
++import org.jbehave.core.annotations.Configure;
++import org.jbehave.core.annotations.UsingEmbedder;
++import org.jbehave.core.annotations.needle.UsingNeedle;
++import org.jbehave.core.embedder.Embedder;
++import org.jbehave.core.junit.needle.NeedleAnnotatedEmbedderRunner;
++import org.jbehave.examples.core.needle.provider.TraderServiceInjectionProvider;
++import org.junit.runner.RunWith;
++
++&amp;lt; at &amp;gt;RunWith(NeedleAnnotatedEmbedderRunner.class)
++&amp;lt; at &amp;gt;Configure()
++&amp;lt; at &amp;gt;UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = true, ignoreFailureInView = true)
++&amp;lt; at &amp;gt;UsingNeedle(provider = TraderServiceInjectionProvider.class)
++public abstract class ParentAnnotatedEmbedderUsingNeedle extends InjectableEmbedder {
++
++}
diff --cc examples/needle/src/main/java/org/jbehave/examples/core/needle/provider/TraderServiceInjectionProvider.java
index 0000000,0000000..be7e539
new file mode 100644
--- /dev/null
+++ b/examples/needle/src/main/java/org/jbehave/examples/core/needle/provider/TraderServiceInjectionProvider.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,0 -1,0 +1,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
++package org.jbehave.examples.core.needle.provider;
++
++import org.jbehave.core.annotations.needle.DefaultInstanceInjectionProvider;
++import org.jbehave.examples.core.service.TradingService;
++
++/**
++ * Injection provider holding the service.
++ * 
++ * &amp;lt; at &amp;gt;author Simon Zambrovski
++ */
++public final class TraderServiceInjectionProvider extends DefaultInstanceInjectionProvider&amp;lt;TradingService&amp;gt; {
++
++  public TraderServiceInjectionProvider() {
++    super(new TradingService());
++  }
++}
diff --cc examples/needle/src/main/java/org/jbehave/examples/core/needle/steps/NeedleTraderSteps.java
index 0000000,0000000..1dedd36
new file mode 100644
--- /dev/null
+++ b/examples/needle/src/main/java/org/jbehave/examples/core/needle/steps/NeedleTraderSteps.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,0 -1,0 +1,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
++package org.jbehave.examples.core.needle.steps;
++
++import javax.inject.Inject;
++
++import org.jbehave.examples.core.service.TradingService;
++import org.jbehave.examples.core.steps.TraderSteps;
++
++/**
++ * POJO annotated to allow Needle injection.
++ */
++public class NeedleTraderSteps extends TraderSteps {
++
++  &amp;lt; at &amp;gt;Inject
++  public NeedleTraderSteps(final TradingService service) {
++    super(service);
++  }
++
++}
diff --cc examples/needle/src/main/resources/needle.properties
index 0000000,0000000..db45157
new file mode 100644
--- /dev/null
+++ b/examples/needle/src/main/resources/needle.properties
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,0 -1,0 +1,1 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
++mock.provider = de.akquinet.jbosscc.needle.mock.MockitoProvider
diff --cc examples/needle/src/test/resources/log4j.properties
index 0000000,0000000..1e57cf0
new file mode 100644
--- /dev/null
+++ b/examples/needle/src/test/resources/log4j.properties
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,0 -1,0 +1,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
++log4j.rootLogger = DEBUG, ROOTLOGGER
++log4j.appender.ROOTLOGGER = org.apache.log4j.ConsoleAppender
++log4j.appender.ROOTLOGGER.layout = org.apache.log4j.PatternLayout
++log4j.appender.ROOTLOGGER.layout.ConversionPattern = %d{HH:mm:ss,SSS} %-5p [%t] %c{3} %3x - %m%n
++# package specific
++log4j.logger.freemarker.cache = ERROR
++log4j.logger.de.akquinet.jbosscc.needle = ERROR
diff --cc examples/pom.xml
index 404969f,a303d05..180e69d
--- a/examples/pom.xml
+++ b/examples/pom.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -25,18 -22,22 +25,19 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
      &amp;lt;module&amp;gt;groovy&amp;lt;/module&amp;gt;
      &amp;lt;module&amp;gt;jruby&amp;lt;/module&amp;gt;
      &amp;lt;module&amp;gt;scala&amp;lt;/module&amp;gt;
 -    &amp;lt;!-- module&amp;gt;spring-security&amp;lt;/module --&amp;gt;
      &amp;lt;module&amp;gt;performance&amp;lt;/module&amp;gt;
      &amp;lt;module&amp;gt;threads&amp;lt;/module&amp;gt;
 -    &amp;lt;module&amp;gt;trader&amp;lt;/module&amp;gt;
 -    &amp;lt;module&amp;gt;trader-ant&amp;lt;/module&amp;gt;
 -    &amp;lt;module&amp;gt;trader-annotations&amp;lt;/module&amp;gt;
 -    &amp;lt;module&amp;gt;trader-urls&amp;lt;/module&amp;gt;
 -    &amp;lt;module&amp;gt;trader-maps&amp;lt;/module&amp;gt;
 -    &amp;lt;module&amp;gt;trader-stepdocs&amp;lt;/module&amp;gt;
 -    &amp;lt;module&amp;gt;trader-testng&amp;lt;/module&amp;gt;
 -    &amp;lt;module&amp;gt;trader-i18n&amp;lt;/module&amp;gt;
 -    &amp;lt;module&amp;gt;trader-guice&amp;lt;/module&amp;gt;
 -    &amp;lt;module&amp;gt;trader-needle&amp;lt;/module&amp;gt;
 -    &amp;lt;module&amp;gt;trader-pico&amp;lt;/module&amp;gt;
 -    &amp;lt;module&amp;gt;trader-spring&amp;lt;/module&amp;gt;
 -    &amp;lt;module&amp;gt;trader-weld&amp;lt;/module&amp;gt;
 +    &amp;lt;module&amp;gt;urls&amp;lt;/module&amp;gt;
 +    &amp;lt;module&amp;gt;maps&amp;lt;/module&amp;gt;
 +    &amp;lt;module&amp;gt;stepdocs&amp;lt;/module&amp;gt;
 +    &amp;lt;module&amp;gt;testng&amp;lt;/module&amp;gt;
 +    &amp;lt;module&amp;gt;i18n&amp;lt;/module&amp;gt;
 +    &amp;lt;module&amp;gt;guice&amp;lt;/module&amp;gt;
++    &amp;lt;module&amp;gt;needle&amp;lt;/module&amp;gt;
 +    &amp;lt;module&amp;gt;pico&amp;lt;/module&amp;gt;
 +    &amp;lt;module&amp;gt;spring&amp;lt;/module&amp;gt;
 +    &amp;lt;!-- module&amp;gt;spring-security&amp;lt;/module --&amp;gt;
 +    &amp;lt;module&amp;gt;weld&amp;lt;/module&amp;gt;
    &amp;lt;/modules&amp;gt;
  
    &amp;lt;dependencies&amp;gt;
diff --cc jbehave-needle/pom.xml
index 0000000,482bea2..f93d877
mode 000000,100644..100644
--- a/jbehave-needle/pom.xml
+++ b/jbehave-needle/pom.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,0 -1,38 +1,38 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+ &amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;
+ &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
+ &amp;lt;parent&amp;gt;
+ &amp;lt;groupId&amp;gt;org.jbehave&amp;lt;/groupId&amp;gt;
+ &amp;lt;artifactId&amp;gt;jbehave&amp;lt;/artifactId&amp;gt;
 -&amp;lt;version&amp;gt;3.8-SNAPSHOT&amp;lt;/version&amp;gt;
++&amp;lt;version&amp;gt;3.9-SNAPSHOT&amp;lt;/version&amp;gt;
+ &amp;lt;/parent&amp;gt;
+ &amp;lt;artifactId&amp;gt;jbehave-needle&amp;lt;/artifactId&amp;gt;
+ &amp;lt;name&amp;gt;JBehave Needle&amp;lt;/name&amp;gt;
+ &amp;lt;description&amp;gt;Extension of JBehave Core that supports Needle mocking and dependency injection&amp;lt;/description&amp;gt;
+ 
+ &amp;lt;dependencies&amp;gt;
+ &amp;lt;dependency&amp;gt;
+ &amp;lt;groupId&amp;gt;org.jbehave&amp;lt;/groupId&amp;gt;
+ &amp;lt;artifactId&amp;gt;jbehave-core&amp;lt;/artifactId&amp;gt;
+ &amp;lt;version&amp;gt;${project.version}&amp;lt;/version&amp;gt;
+ &amp;lt;/dependency&amp;gt;
+ &amp;lt;dependency&amp;gt;
+ &amp;lt;groupId&amp;gt;de.akquinet.jbosscc&amp;lt;/groupId&amp;gt;
+ &amp;lt;artifactId&amp;gt;jbosscc-needle&amp;lt;/artifactId&amp;gt;
+ &amp;lt;version&amp;gt;2.2&amp;lt;/version&amp;gt;
+ &amp;lt;/dependency&amp;gt;
+ &amp;lt;dependency&amp;gt;
+ &amp;lt;groupId&amp;gt;javax.inject&amp;lt;/groupId&amp;gt;
+ &amp;lt;artifactId&amp;gt;javax.inject&amp;lt;/artifactId&amp;gt;
+ &amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;
+ &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
+ &amp;lt;/dependency&amp;gt;
+ &amp;lt;dependency&amp;gt;
+ &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
+ &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;
+ &amp;lt;version&amp;gt;1.7.5&amp;lt;/version&amp;gt;
+ &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
+ &amp;lt;/dependency&amp;gt;
+ &amp;lt;/dependencies&amp;gt;
+ 
+ &amp;lt;/project&amp;gt;
diff --cc jbehave-needle/src/test/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilderBehaviour.java
index 0000000,369892e..ae3cc1d
mode 000000,100644..100644
--- a/jbehave-needle/src/test/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilderBehaviour.java
+++ b/jbehave-needle/src/test/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilderBehaviour.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,0 -1,287 +1,289 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+ package org.jbehave.core.configuration.needle;
+ 
 -import static org.hamcrest.MatcherAssert.assertThat;
 -import static org.hamcrest.Matchers.equalTo;
 -import static org.hamcrest.Matchers.instanceOf;
 -import static org.hamcrest.Matchers.is;
 -import static org.hamcrest.collection.IsCollectionContaining.hasItems;
 -import static org.junit.Assert.assertNotNull;
 -import static org.junit.Assert.assertTrue;
 -
+ import java.lang.reflect.Type;
+ import java.text.DateFormat;
+ import java.text.ParseException;
+ import java.text.SimpleDateFormat;
+ import java.util.Date;
+ import java.util.HashSet;
+ import java.util.List;
+ import java.util.Set;
+ 
+ import org.jbehave.core.annotations.Configure;
+ import org.jbehave.core.annotations.UsingSteps;
+ import org.jbehave.core.annotations.needle.UsingNeedle;
+ import org.jbehave.core.configuration.AnnotationBuilder;
+ import org.jbehave.core.configuration.Configuration;
+ import org.jbehave.core.configuration.MostUsefulConfiguration;
+ import org.jbehave.core.model.ExamplesTable;
+ import org.jbehave.core.steps.CandidateSteps;
+ import org.jbehave.core.steps.ParameterConverters;
+ import org.jbehave.core.steps.ParameterConverters.ParameterConverter;
+ import org.jbehave.core.steps.Steps;
+ import org.jbehave.core.steps.needle.NeedleStepsFactoryBehaviour.FooSteps;
+ import org.jbehave.core.steps.needle.NeedleStepsFactoryBehaviour.FooStepsWithDependency;
+ import org.jbehave.core.steps.needle.ValueGetter;
+ import org.junit.Assert;
+ import org.junit.Test;
+ 
++import static org.hamcrest.MatcherAssert.assertThat;
++
++import static org.hamcrest.Matchers.equalTo;
++import static org.hamcrest.Matchers.hasItems;
++import static org.hamcrest.Matchers.instanceOf;
++import static org.hamcrest.Matchers.is;
++
++import static org.junit.Assert.assertNotNull;
++import static org.junit.Assert.assertTrue;
++
+ public class NeedleAnnotationBuilderBehaviour {
+ 
+ &amp;lt; at &amp;gt;Test
+ public void shouldBuildConfigurationFromAnnotationsUsingConfigureAndGuiceConverters() {
+ final AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
+ AnnotatedUsingConfigureAndNeedleConverters.class);
+ final Configuration configuration = builderAnnotated
+ .buildConfiguration();
+ assertThatCustomObjectIsConverted(configuration.parameterConverters());
+ assertThatDateIsConvertedWithFormat(
+ configuration.parameterConverters(), new SimpleDateFormat(
+ "yyyy-MM-dd"));
+ assertThatExamplesTableIsConverted(configuration.parameterConverters());
+ }
+ 
+ private void assertThatCustomObjectIsConverted(
+ final ParameterConverters parameterConverters) {
+ assertThat(((CustomObject) parameterConverters.convert("value",
+ CustomObject.class)).toString(), equalTo(new CustomObject(
+ "value").toString()));
+ }
+ 
+ private void assertThatDateIsConvertedWithFormat(
+ final ParameterConverters parameterConverters,
+ final DateFormat dateFormat) {
+ final String date = "2010-10-10";
+ try {
+ assertThat((Date) parameterConverters.convert(date, Date.class),
+ equalTo(dateFormat.parse(date)));
+ } catch (final ParseException e) {
+ Assert.fail();
+ }
+ }
+ 
+ private void assertThatExamplesTableIsConverted(
+ final ParameterConverters parameterConverters) {
+ final String tableAsString = "||one||two||\n" + "|1|2|";
+ final ExamplesTable table = new ExamplesTable(tableAsString);
+ assertThat(table.getHeaders(), hasItems("one", "two"));
+ }
+ 
+ &amp;lt; at &amp;gt;Test
+ public void shouldBuildDefaultConfigurationIfAnnotationOrAnnotatedValuesNotPresent() {
+ final AnnotationBuilder builderNotAnnotated = new NeedleAnnotationBuilder(
+ NotAnnotated.class);
+ assertThatConfigurationIs(builderNotAnnotated.buildConfiguration(),
+ new MostUsefulConfiguration());
+ final AnnotationBuilder builderAnnotatedWithoutModules = new NeedleAnnotationBuilder(
+ AnnotatedWithoutInjectors.class);
+ assertThatConfigurationIs(
+ builderAnnotatedWithoutModules.buildConfiguration(),
+ new MostUsefulConfiguration());
+ }
+ 
+ private void assertThatConfigurationIs(
+ final Configuration builtConfiguration,
+ final Configuration defaultConfiguration) {
+ assertThat(builtConfiguration.failureStrategy(),
+ instanceOf(defaultConfiguration.failureStrategy().getClass()));
+ assertThat(builtConfiguration.storyLoader(),
+ instanceOf(defaultConfiguration.storyLoader().getClass()));
+ assertThat(builtConfiguration.stepPatternParser(),
+ instanceOf(defaultConfiguration.stepPatternParser().getClass()));
+ assertThat(builtConfiguration.storyReporterBuilder().formats(),
+ equalTo(defaultConfiguration.storyReporterBuilder().formats()));
+ assertThat(builtConfiguration.storyReporterBuilder().outputDirectory(),
+ equalTo(defaultConfiguration.storyReporterBuilder()
+ .outputDirectory()));
+ assertThat(builtConfiguration.storyReporterBuilder().viewResources(),
+ equalTo(defaultConfiguration.storyReporterBuilder()
+ .viewResources()));
+ assertThat(builtConfiguration.storyReporterBuilder()
+ .reportFailureTrace(), equalTo(defaultConfiguration
+ .storyReporterBuilder().reportFailureTrace()));
+ }
+ 
+ &amp;lt; at &amp;gt;Test
+ public void shouldBuildCandidateStepsFromAnnotationsUsingNeedle() {
+ final AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
+ AnnotatedUsingNeedle.class);
+ final Configuration configuration = builderAnnotated
+ .buildConfiguration();
+ assertTrue(builderAnnotated.buildCandidateSteps(configuration)
+ .isEmpty());
+ }
+ 
+ &amp;lt; at &amp;gt;Test
+ public void shouldBuildCandidateStepsFromAnnotationsUsingStepsAndNeedle() {
+ final AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
+ AnnotatedUsingStepsAndNeedle.class);
+ final Configuration configuration = builderAnnotated
+ .buildConfiguration();
+ assertThatStepsInstancesAre(
+ builderAnnotated.buildCandidateSteps(configuration),
+ FooSteps.class);
+ }
+ 
+ &amp;lt; at &amp;gt;Test
+ public void shouldBuildCandidateStepsFromAnnotationsUsingStepsAndGuiceAndConverters() {
+ final AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
+ AnnotatedUsingConfigureAndNeedleConverters.class);
+ final Configuration configuration = builderAnnotated
+ .buildConfiguration();
+ assertThatStepsInstancesAre(
+ builderAnnotated.buildCandidateSteps(configuration),
+ FooSteps.class);
+ }
+ 
+ &amp;lt; at &amp;gt;Test
+ public void shouldBuildEmptyStepsListIfAnnotationOrAnnotatedValuesNotPresent() {
+ final AnnotationBuilder builderNotAnnotated = new NeedleAnnotationBuilder(
+ NotAnnotated.class);
+ assertThatStepsInstancesAre(builderNotAnnotated.buildCandidateSteps());
+ 
+ final AnnotationBuilder builderAnnotatedWithoutLocations = new NeedleAnnotationBuilder(
+ AnnotatedWithoutInjectors.class);
+ assertThatStepsInstancesAre(builderAnnotatedWithoutLocations
+ .buildCandidateSteps());
+ }
+ 
+ &amp;lt; at &amp;gt;Test
+ public void shouldBuildStepsList() {
+ final AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
+ AnnotatedMultipleSteps.class);
+ final List&amp;lt;CandidateSteps&amp;gt; actual = builderAnnotated
+ .buildCandidateSteps();
+ assertThatStepsInstancesAre(actual, FooStepsWithDependency.class,
+ FooSteps.class);
+ }
+ 
+ &amp;lt; at &amp;gt;Test
+ public void shouldCreateOnlyOneContainerForMultipleBuildInvocations() {
+ final NeedleAnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
+ AnnotatedUsingStepsAndNeedle.class);
+ builderAnnotated.buildConfiguration();
+ assertTrue(!builderAnnotated.getProvider().isEmpty());
+ }
+ 
+ &amp;lt; at &amp;gt;Test
+ public void shouldSupplyInjectors() {
+ final NeedleAnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
+ AnnotatedWithStepsWithDependency.class);
+ final List&amp;lt;CandidateSteps&amp;gt; buildCandidateSteps = builderAnnotated
+ .buildCandidateSteps();
+ assertThatStepsInstancesAre(buildCandidateSteps,
+ FooStepsWithDependency.class);
+ final ValueGetter getter = ((FooStepsWithDependency) ((Steps) buildCandidateSteps
+ .get(0)).instance()).getGetter();
+ assertNotNull(getter);
+ assertThat((String) getter.getValue(), is(ValueGetter.VALUE));
+ }
+ 
+ private void assertThatStepsInstancesAre(
+ final List&amp;lt;CandidateSteps&amp;gt; candidateSteps,
+ final Class&amp;lt;?&amp;gt;... stepsClasses) {
+ assertThat(candidateSteps.size(), equalTo(stepsClasses.length));
+ 
+ // transform candidateSteps to Set of classes
+ final Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; candidateStepClasses = new HashSet&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;();
+ for (final CandidateSteps step : candidateSteps) {
+ candidateStepClasses.add(((Steps) step).instance().getClass());
+ }
+ assertThat(candidateStepClasses, hasItems(stepsClasses));
+ }
+ 
+ &amp;lt; at &amp;gt;Configure()
+ &amp;lt; at &amp;gt;UsingNeedle(provider = { ValueGetterProvider.class })
+ private static class AnnotatedUsingNeedle {
+ 
+ }
+ 
+ &amp;lt; at &amp;gt;Configure()
+ &amp;lt; at &amp;gt;UsingSteps(instances = { FooSteps.class })
+ &amp;lt; at &amp;gt;UsingNeedle(provider = { ValueGetterProvider.class })
+ private static class AnnotatedUsingStepsAndNeedle {
+ 
+ }
+ 
+ &amp;lt; at &amp;gt;Configure(parameterConverters = { MyExampleTableConverter.class,
+ MyDateConverter.class, CustomConverter.class })
+ &amp;lt; at &amp;gt;UsingSteps(instances = { FooSteps.class })
+ &amp;lt; at &amp;gt;UsingNeedle(provider = { ValueGetterProvider.class })
+ private static class AnnotatedUsingConfigureAndNeedleConverters {
+ 
+ }
+ 
+ &amp;lt; at &amp;gt;Configure()
+ &amp;lt; at &amp;gt;UsingNeedle()
+ private static class AnnotatedWithoutInjectors {
+ 
+ }
+ 
+ &amp;lt; at &amp;gt;Configure()
+ &amp;lt; at &amp;gt;UsingSteps(instances = { FooStepsWithDependency.class })
+ &amp;lt; at &amp;gt;UsingNeedle()
+ private static class AnnotatedWithStepsWithDependency {
+ 
+ }
+ 
+ &amp;lt; at &amp;gt;Configure()
+ &amp;lt; at &amp;gt;UsingSteps(instances = { FooStepsWithDependency.class, FooSteps.class })
+ &amp;lt; at &amp;gt;UsingNeedle()
+ private static class AnnotatedMultipleSteps {
+ 
+ }
+ 
+ private static class NotAnnotated {
+ 
+ }
+ 
+ public static class CustomConverter implements ParameterConverter {
+ 
+ public boolean accept(final Type type) {
+ return ((Class&amp;lt;?&amp;gt;) type).isAssignableFrom(CustomObject.class);
+ }
+ 
+ public Object convertValue(final String value, final Type type) {
+ return new CustomObject(value);
+ }
+ }
+ 
+ public static class MyExampleTableConverter extends
+ ParameterConverters.ExamplesTableConverter {
+ 
+ public MyExampleTableConverter() {
+ }
+ 
+ }
+ 
+ public static class MyDateConverter extends
+ ParameterConverters.DateConverter {
+ 
+ public MyDateConverter() {
+ super(new SimpleDateFormat("yyyy-MM-dd"));
+ }
+ }
+ 
+ public static class CustomObject {
+ 
+ private final String value;
+ 
+ public CustomObject(final String value) {
+ this.value = value;
+ }
+ 
+ &amp;lt; at &amp;gt;Override
+ public String toString() {
+ return value;
+ }
+ }
+ }
Changed files:

Mexamples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedPathRunnerUsingNeedle.java
Mexamples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/ParentAnnotatedEmbedderUsingNeedle.java
Dexamples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderServiceInjectionProvider.java
Mexamples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderStoriesUsingNeedle.java
Mexamples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/NeedleTraderSteps.java
Mexamples/trader-needle/src/test/java/org/jbehave/examples/trader/needle/NeedleTraderStepsConstructorInjectionTest.java
Aexamples/trader-needle/src/test/java/org/jbehave/examples/trader/needle/NeedleTraderStepsConstructorInjectionTest.java
Aexamples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/provider/TraderServiceInjectionProvider.java
Mexamples/trader-needle/pom.xml
Aexamples/trader-needle/src/test/resources/log4j.properties
Mjbehave-needle/src/test/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilderBehaviour.java
Mjbehave-needle/src/main/java/org/jbehave/core/steps/needle/NeedleStepsFactory.java
Mpom.xml
Mexamples/pom.xml
Mexamples/trader/src/main/java/org/jbehave/examples/trader/steps/TraderSteps.java
Mjbehave-needle/src/main/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilder.java
Mjbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/CollectInjectionProvidersFromStepsInstance.java
Mjbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/CreateInstanceByDefaultConstructor.java
Mjbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/JBehaveNeedleConfiguration.java
Mjbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/LoadResourceBundle.java
Aexamples/trader-needle/pom.xml
Aexamples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedEmbedderUsingNeedle.java
Aexamples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedEmbedderUsingNeedleAndSteps.java
Aexamples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedPathRunnerUsingNeedle.java
Aexamples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/InheritingAnnotatedEmbedderUsingSteps.java
Aexamples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/NeedleTraderSteps.java
Aexamples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/ParentAnnotatedEmbedderUsingNeedle.java
Aexamples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderServiceInjectionProvider.java
Aexamples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderStoriesUsingNeedle.java
Aexamples/trader-needle/src/main/resources/needle.properties
Ajbehave-needle/src/main/java/org/jbehave/core/annotations/needle/DefaultInstanceInjectionProvider.java
Ajbehave-needle/src/main/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilder.java
Ajbehave-needle/src/main/java/org/jbehave/core/junit/needle/NeedleAnnotatedEmbedderRunner.java
Ajbehave-needle/src/main/java/org/jbehave/core/junit/needle/NeedleAnnotatedPathRunner.java
Ajbehave-needle/src/test/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilderBehaviour.java
Ajbehave-needle/src/test/java/org/jbehave/core/configuration/needle/ValueGetterProvider.java
Ajbehave-needle/src/test/java/org/jbehave/core/junit/needle/NeedleAnnotatedEmbedderRunnerBehaviour.java
Ajbehave-needle/src/test/java/org/jbehave/core/steps/needle/NeedleStepsFactoryBehaviour.java
Ajbehave-needle/src/test/java/org/jbehave/core/steps/needle/ValueGetter.java
Ajbehave-needle/src/test/resources/jbehave-needle.properties
Mjbehave-needle/pom.xml
Djbehave-needle/src/test/java/org/jbehave/core/steps/needle/NeedleStepsFactoryBehavior.java
Mjbehave-needle/src/test/resources/log4j.properties
Msettings.xml
Ajbehave-needle/pom.xml
Ajbehave-needle/src/main/java/org/jbehave/core/annotations/needle/InjectionProviderInstancesSupplier.java
Ajbehave-needle/src/main/java/org/jbehave/core/annotations/needle/NeedleInjectionProvider.java
Ajbehave-needle/src/main/java/org/jbehave/core/annotations/needle/UsingNeedle.java
Ajbehave-needle/src/main/java/org/jbehave/core/steps/needle/NeedleStepsFactory.java
Ajbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/CollectInjectionProvidersFromStepsInstance.java
Ajbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/CreateInstanceByDefaultConstructor.java
Ajbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/JBehaveNeedleConfiguration.java
Ajbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/LoadResourceBundle.java
Ajbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/ReadInjectionProviderClassNames.java
Ajbehave-needle/src/test/java/org/jbehave/core/steps/needle/NeedleStepsFactoryBehavior.java
Ajbehave-needle/src/test/resources/log4j.properties
Ajbehave-needle/src/test/resources/needle.properties




&lt;/pre&gt;</description>
    <dc:creator>Mauro Talevi</dc:creator>
    <dc:date>2013-06-02T09:32:42</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3712">
    <title>[scm-core][14/15] moved provider to extra package and organized imports</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3712</link>
    <description>&lt;pre&gt;commit c4aa030b59270f0099a652476734ea8905e3df08
Author:     Jan Galinski &amp;lt;jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Thu, 9 May 2013 12:05:12 +0200
Commit:     Jan Galinski &amp;lt;jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Thu, 9 May 2013 12:05:12 +0200

    moved provider to extra package and organized imports

diff --git a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedPathRunnerUsingNeedle.java b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedPathRunnerUsingNeedle.java
index ad82399..04ab032 100644
--- a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedPathRunnerUsingNeedle.java
+++ b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedPathRunnerUsingNeedle.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -9,9 +9,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import org.jbehave.core.junit.needle.NeedleAnnotatedPathRunner;
 import org.junit.runner.RunWith;
 
 /**
- * Run stories via annotated embedder configuration and steps using Needle. The textual trader stories are exactly the
- * same ones found in the jbehave-trader-example. Here we are only concerned with using the container to compose the
- * configuration and the steps instances.
+ * Run stories via annotated embedder configuration and steps using Needle. The
+ * textual trader stories are exactly the same ones found in the
+ * jbehave-trader-example. Here we are only concerned with using the container
+ * to compose the configuration and the steps instances.
  */
 &amp;lt; at &amp;gt;RunWith(NeedleAnnotatedPathRunner.class)
 &amp;lt; at &amp;gt;Configure
diff --git a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/ParentAnnotatedEmbedderUsingNeedle.java b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/ParentAnnotatedEmbedderUsingNeedle.java
index 1cd0452..07de6ac 100644
--- a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/ParentAnnotatedEmbedderUsingNeedle.java
+++ b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/ParentAnnotatedEmbedderUsingNeedle.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -6,6 +6,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import org.jbehave.core.annotations.UsingEmbedder;
 import org.jbehave.core.annotations.needle.UsingNeedle;
 import org.jbehave.core.embedder.Embedder;
 import org.jbehave.core.junit.needle.NeedleAnnotatedEmbedderRunner;
+import org.jbehave.examples.trader.needle.provider.TraderServiceInjectionProvider;
 import org.junit.runner.RunWith;
 
 &amp;lt; at &amp;gt;RunWith(NeedleAnnotatedEmbedderRunner.class)
diff --git a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderServiceInjectionProvider.java b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderServiceInjectionProvider.java
deleted file mode 100644
index bd9d78e..0000000
--- a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderServiceInjectionProvider.java
+++ /dev/null
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,16 +0,0 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
-package org.jbehave.examples.trader.needle;
-
-import org.jbehave.core.annotations.needle.DefaultInstanceInjectionProvider;
-import org.jbehave.examples.trader.service.TradingService;
-
-/**
- * Injection provider holding the service.
- * 
- * &amp;lt; at &amp;gt;author Simon Zambrovski
- */
-public final class TraderServiceInjectionProvider extends DefaultInstanceInjectionProvider&amp;lt;TradingService&amp;gt; {
-
-public TraderServiceInjectionProvider() {
-super(new TradingService());
-}
-}
diff --git a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderStoriesUsingNeedle.java b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderStoriesUsingNeedle.java
index deed234..9245d80 100644
--- a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderStoriesUsingNeedle.java
+++ b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderStoriesUsingNeedle.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -10,6 +10,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import org.jbehave.core.io.StoryFinder;
 import org.jbehave.core.steps.InjectableStepsFactory;
 import org.jbehave.core.steps.needle.NeedleStepsFactory;
 import org.jbehave.examples.trader.TraderStories;
+import org.jbehave.examples.trader.needle.provider.TraderServiceInjectionProvider;
 import org.jbehave.examples.trader.steps.AndSteps;
 import org.jbehave.examples.trader.steps.BeforeAfterSteps;
 import org.jbehave.examples.trader.steps.CalendarSteps;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -21,16 +22,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import org.jbehave.examples.trader.steps.SearchSteps;
 import de.akquinet.jbosscc.needle.injection.InjectionProvider;
 
 /**
- * Run trader stories using NeedleStepsFactory. The textual trader stories are exactly the same ones found in the
- * jbehave-trader-example. Here we are only concerned with using the container to compose the steps instances.
+ * Run trader stories using NeedleStepsFactory. The textual trader stories are
+ * exactly the same ones found in the jbehave-trader-example. Here we are only
+ * concerned with using the container to compose the steps instances.
  */
 public class TraderStoriesUsingNeedle extends TraderStories {
 
   &amp;lt; at &amp;gt;Override
   public InjectableStepsFactory stepsFactory() {
-final Class&amp;lt;?&amp;gt;[] steps = new Class&amp;lt;?&amp;gt;[] { NeedleTraderSteps.class, BeforeAfterSteps.class, AndSteps.class,
-CalendarSteps.class, PendingSteps.class, PriorityMatchingSteps.class, SandpitSteps.class,
-SearchSteps.class };
+    final Class&amp;lt;?&amp;gt;[] steps = new Class&amp;lt;?&amp;gt;[] { NeedleTraderSteps.class, BeforeAfterSteps.class, AndSteps.class, CalendarSteps.class, PendingSteps.class,
+        PriorityMatchingSteps.class, SandpitSteps.class, SearchSteps.class };
 
     final Set&amp;lt;InjectionProvider&amp;lt;?&amp;gt;&amp;gt; providers = new HashSet&amp;lt;InjectionProvider&amp;lt;?&amp;gt;&amp;gt;();
     providers.add(new TraderServiceInjectionProvider());



&lt;/pre&gt;</description>
    <dc:creator>Jan Galinski</dc:creator>
    <dc:date>2013-06-02T09:32:41</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3711">
    <title>[scm-core][13/15] enable constructor injection</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3711</link>
    <description>&lt;pre&gt;commit c8b4a7d7dfd3499b279082bbf1c8f8691f25ca10
Author:     Jan Galinski &amp;lt;jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Thu, 9 May 2013 12:03:31 +0200
Commit:     Jan Galinski &amp;lt;jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Thu, 9 May 2013 12:03:31 +0200

    enable constructor injection

diff --git a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/NeedleTraderSteps.java b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/NeedleTraderSteps.java
index 77be1d9..7cfb311 100644
--- a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/NeedleTraderSteps.java
+++ b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/NeedleTraderSteps.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -11,15 +11,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import org.jbehave.examples.trader.steps.TraderSteps;
 public class NeedleTraderSteps extends TraderSteps {
 
   &amp;lt; at &amp;gt;Inject
-private TradingService injectedService;
-
-public NeedleTraderSteps() {
-
-}
-
-&amp;lt; at &amp;gt;Override
-public TradingService getService() {
-return this.injectedService;
+  public NeedleTraderSteps(final TradingService service) {
+    super(service);
   }
 
 }
diff --git a/examples/trader-needle/src/test/java/org/jbehave/examples/trader/needle/NeedleTraderStepsConstructorInjectionTest.java b/examples/trader-needle/src/test/java/org/jbehave/examples/trader/needle/NeedleTraderStepsConstructorInjectionTest.java
index dcf8cfd..c1d284b 100644
--- a/examples/trader-needle/src/test/java/org/jbehave/examples/trader/needle/NeedleTraderStepsConstructorInjectionTest.java
+++ b/examples/trader-needle/src/test/java/org/jbehave/examples/trader/needle/NeedleTraderStepsConstructorInjectionTest.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5,29 +5,26 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 
 import org.jbehave.examples.trader.model.Trader;
+import org.jbehave.examples.trader.needle.provider.TraderServiceInjectionProvider;
 import org.jbehave.examples.trader.service.TradingService;
 import org.junit.Rule;
 import org.junit.Test;
 
-import de.akquinet.jbosscc.needle.annotation.InjectIntoMany;
 import de.akquinet.jbosscc.needle.annotation.ObjectUnderTest;
 import de.akquinet.jbosscc.needle.junit.NeedleRule;
 
+/**
+ * Assure constructor injection with {&amp;lt; at &amp;gt;link TradingService} works.
+ * 
+ * &amp;lt; at &amp;gt;author Jan Galinski, Holisticon AG
+ */
 public class NeedleTraderStepsConstructorInjectionTest {
 
   private static final String BAR = "bar";
   private static final String FOO = "foo";
 
   &amp;lt; at &amp;gt;Rule
-  public final NeedleRule needleRule = new NeedleRule();
-
-  /**
-   * Constructor Injection on needleTraderSteps works. But needle creates a mock
-   * of {&amp;lt; at &amp;gt;link TradingService} by default. By using {&amp;lt; at &amp;gt;link InjectIntoMany}, a
-   * concrete instance is bound.
-   */
-  &amp;lt; at &amp;gt;InjectIntoMany
-  private final TradingService tradingService = new TradingService();
+  public final NeedleRule needleRule = new NeedleRule(new TraderServiceInjectionProvider());
 
   &amp;lt; at &amp;gt;ObjectUnderTest
   private NeedleTraderSteps needleTraderSteps;



&lt;/pre&gt;</description>
    <dc:creator>Jan Galinski</dc:creator>
    <dc:date>2013-06-02T09:32:41</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3710">
    <title>[scm-core][12/15] assure that Constructor injection works</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3710</link>
    <description>&lt;pre&gt;commit 8fa9cfe59876eb53b289e45dcc9425154d896f6b
Author:     Jan Galinski &amp;lt;jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Thu, 9 May 2013 11:56:21 +0200
Commit:     Jan Galinski &amp;lt;jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Thu, 9 May 2013 11:56:21 +0200

    assure that Constructor injection works

diff --git a/examples/trader-needle/src/test/java/org/jbehave/examples/trader/needle/NeedleTraderStepsConstructorInjectionTest.java b/examples/trader-needle/src/test/java/org/jbehave/examples/trader/needle/NeedleTraderStepsConstructorInjectionTest.java
new file mode 100644
index 0000000..dcf8cfd
--- /dev/null
+++ b/examples/trader-needle/src/test/java/org/jbehave/examples/trader/needle/NeedleTraderStepsConstructorInjectionTest.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,44 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.examples.trader.needle;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+import org.jbehave.examples.trader.model.Trader;
+import org.jbehave.examples.trader.service.TradingService;
+import org.junit.Rule;
+import org.junit.Test;
+
+import de.akquinet.jbosscc.needle.annotation.InjectIntoMany;
+import de.akquinet.jbosscc.needle.annotation.ObjectUnderTest;
+import de.akquinet.jbosscc.needle.junit.NeedleRule;
+
+public class NeedleTraderStepsConstructorInjectionTest {
+
+  private static final String BAR = "bar";
+  private static final String FOO = "foo";
+
+  &amp;lt; at &amp;gt;Rule
+  public final NeedleRule needleRule = new NeedleRule();
+
+  /**
+   * Constructor Injection on needleTraderSteps works. But needle creates a mock
+   * of {&amp;lt; at &amp;gt;link TradingService} by default. By using {&amp;lt; at &amp;gt;link InjectIntoMany}, a
+   * concrete instance is bound.
+   */
+  &amp;lt; at &amp;gt;InjectIntoMany
+  private final TradingService tradingService = new TradingService();
+
+  &amp;lt; at &amp;gt;ObjectUnderTest
+  private NeedleTraderSteps needleTraderSteps;
+
+  &amp;lt; at &amp;gt;Test
+  public void shouldCreateNewInstanceByConstructorInjection() {
+    assertNotNull(needleTraderSteps.getService());
+    final Trader newTrader = needleTraderSteps.getService().newTrader(FOO, BAR);
+    assertNotNull(newTrader);
+    assertThat(newTrader.getName(), is(FOO));
+    assertThat(newTrader.getRank(), is(BAR));
+  }
+
+}



&lt;/pre&gt;</description>
    <dc:creator>Jan Galinski</dc:creator>
    <dc:date>2013-06-02T09:32:41</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3709">
    <title>[scm-core][10/15] added logging support for testing</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3709</link>
    <description>&lt;pre&gt;commit 72e3f77576e74f45032c3a8194ce55e89a2382ac
Author:     Jan Galinski &amp;lt;jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Thu, 9 May 2013 11:55:30 +0200
Commit:     Jan Galinski &amp;lt;jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Thu, 9 May 2013 11:55:30 +0200

    added logging support for testing

diff --git a/examples/trader-needle/pom.xml b/examples/trader-needle/pom.xml
index 475f951..f45f785 100644
--- a/examples/trader-needle/pom.xml
+++ b/examples/trader-needle/pom.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -25,6 +25,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 &amp;lt;artifactId&amp;gt;javax.inject&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;
 &amp;lt;/dependency&amp;gt;
+&amp;lt;dependency&amp;gt;
+  &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;
+  &amp;lt;artifactId&amp;gt;slf4j-log4j12&amp;lt;/artifactId&amp;gt;
+  &amp;lt;version&amp;gt;1.7.5&amp;lt;/version&amp;gt;
+  &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
+&amp;lt;/dependency&amp;gt;
 &amp;lt;/dependencies&amp;gt;
 
 &amp;lt;build&amp;gt;
diff --git a/examples/trader-needle/src/test/resources/log4j.properties b/examples/trader-needle/src/test/resources/log4j.properties
new file mode 100644
index 0000000..1e57cf0
--- /dev/null
+++ b/examples/trader-needle/src/test/resources/log4j.properties
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+log4j.rootLogger = DEBUG, ROOTLOGGER
+log4j.appender.ROOTLOGGER = org.apache.log4j.ConsoleAppender
+log4j.appender.ROOTLOGGER.layout = org.apache.log4j.PatternLayout
+log4j.appender.ROOTLOGGER.layout.ConversionPattern = %d{HH:mm:ss,SSS} %-5p [%t] %c{3} %3x - %m%n
+# package specific
+log4j.logger.freemarker.cache = ERROR
+log4j.logger.de.akquinet.jbosscc.needle = ERROR



&lt;/pre&gt;</description>
    <dc:creator>Jan Galinski</dc:creator>
    <dc:date>2013-06-02T09:32:40</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3708">
    <title>[scm-core][11/15] moved to package provider</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3708</link>
    <description>&lt;pre&gt;commit 044c53da569aab7ad2e2ab126c5a4e9988710d54
Author:     Jan Galinski &amp;lt;jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Thu, 9 May 2013 11:55:50 +0200
Commit:     Jan Galinski &amp;lt;jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Thu, 9 May 2013 11:55:50 +0200

    moved to package provider

diff --git a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/provider/TraderServiceInjectionProvider.java b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/provider/TraderServiceInjectionProvider.java
new file mode 100644
index 0000000..cafb637
--- /dev/null
+++ b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/provider/TraderServiceInjectionProvider.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.examples.trader.needle.provider;
+
+import org.jbehave.core.annotations.needle.DefaultInstanceInjectionProvider;
+import org.jbehave.examples.trader.service.TradingService;
+
+/**
+ * Injection provider holding the service.
+ * 
+ * &amp;lt; at &amp;gt;author Simon Zambrovski
+ */
+public final class TraderServiceInjectionProvider extends DefaultInstanceInjectionProvider&amp;lt;TradingService&amp;gt; {
+
+  public TraderServiceInjectionProvider() {
+    super(new TradingService());
+  }
+}



&lt;/pre&gt;</description>
    <dc:creator>Jan Galinski</dc:creator>
    <dc:date>2013-06-02T09:32:40</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3707">
    <title>[scm-core][7/15] changed variable name</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3707</link>
    <description>&lt;pre&gt;commit 1cd7c60cb4df739249ac9a7a11a04b864c73d807
Author:     zambrovski &amp;lt;simon.zambrovski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Tue, 7 May 2013 02:05:16 +0200
Commit:     zambrovski &amp;lt;simon.zambrovski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Tue, 7 May 2013 02:05:16 +0200

    changed variable name

diff --git a/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/NeedleStepsFactory.java b/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/NeedleStepsFactory.java
index 5e368a1..aaffad2 100644
--- a/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/NeedleStepsFactory.java
+++ b/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/NeedleStepsFactory.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -34,7 +34,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import de.akquinet.jbosscc.needle.injection.InjectionProvider;
  */
 public class NeedleStepsFactory extends NeedleTestcase implements InjectableStepsFactory {
 
-private final Map&amp;lt;Class&amp;lt;?&amp;gt;, Object&amp;gt; cachedStepsInstances = new LinkedHashMap&amp;lt;Class&amp;lt;?&amp;gt;, Object&amp;gt;();
+private final Map&amp;lt;Class&amp;lt;?&amp;gt;, Object&amp;gt; cachedTypeInstances = new LinkedHashMap&amp;lt;Class&amp;lt;?&amp;gt;, Object&amp;gt;();
 
 private final Configuration configuration;
 private Class&amp;lt;?&amp;gt;[] steps;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -93,15 +93,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class NeedleStepsFactory extends NeedleTestcase implements InjectableStep
  * {&amp;lt; at &amp;gt;inheritDoc}
  */
 public Object createInstanceOfType(Class&amp;lt;?&amp;gt; type) {
-final Object instance = cachedStepsInstances.get(type);
+final Object instance = cachedTypeInstances.get(type);
 if (instance == null) {
 try {
 final Object stepsInstance = CreateInstanceByDefaultConstructor.INSTANCE.apply(type);
-final InjectionProvider&amp;lt;?&amp;gt;[] foundProviders = CollectInjectionProvidersFromStepsInstance.INSTANCE
-.apply(stepsInstance);
+final InjectionProvider&amp;lt;?&amp;gt;[] foundProviders = CollectInjectionProvidersFromStepsInstance.INSTANCE.apply(stepsInstance);
 addInjectionProvider(foundProviders);
 initTestcase(stepsInstance);
-cachedStepsInstances.put(type, stepsInstance);
+cachedTypeInstances.put(type, stepsInstance);
 return stepsInstance;
 } catch (final Exception e) {
 throw new IllegalStateException(e);
diff --git a/pom.xml b/pom.xml
index 09c12d8..aabdae7 100755
--- a/pom.xml
+++ b/pom.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -33,6 +33,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt;module&amp;gt;jbehave-groovy&amp;lt;/module&amp;gt;
     &amp;lt;module&amp;gt;jbehave-scala&amp;lt;/module&amp;gt;
     &amp;lt;module&amp;gt;jbehave-guice&amp;lt;/module&amp;gt;
+    &amp;lt;module&amp;gt;jbehave-needle&amp;lt;/module&amp;gt;
 &amp;lt;module&amp;gt;jbehave-odf&amp;lt;/module&amp;gt;
     &amp;lt;module&amp;gt;jbehave-pico&amp;lt;/module&amp;gt;
     &amp;lt;module&amp;gt;jbehave-spring&amp;lt;/module&amp;gt;



&lt;/pre&gt;</description>
    <dc:creator>zambrovski</dc:creator>
    <dc:date>2013-06-02T09:32:38</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3706">
    <title>[scm-core][9/15] fixed assertThatStepsInstancesAre() so that the order of annotation entries or stepsClasses does not matter</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3706</link>
    <description>&lt;pre&gt;commit 4af1d41e7b6af34e83e4631adfd8efdc3796b58d
Author:     Jan Galinski &amp;lt;jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Wed, 8 May 2013 16:45:40 +0200
Commit:     Jan Galinski &amp;lt;jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Wed, 8 May 2013 16:45:40 +0200

    fixed assertThatStepsInstancesAre() so that the order of annotation entries or stepsClasses does not matter

diff --git a/jbehave-needle/src/test/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilderBehaviour.java b/jbehave-needle/src/test/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilderBehaviour.java
index 63e2689..369892e 100644
--- a/jbehave-needle/src/test/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilderBehaviour.java
+++ b/jbehave-needle/src/test/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilderBehaviour.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2,9 +2,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; package org.jbehave.core.configuration.needle;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.hasItems;
 import static org.hamcrest.Matchers.instanceOf;
 import static org.hamcrest.Matchers.is;
+import static org.hamcrest.collection.IsCollectionContaining.hasItems;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -13,7 +13,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.jbehave.core.annotations.Configure;
 import org.jbehave.core.annotations.UsingSteps;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -184,16 +186,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class NeedleAnnotationBuilderBehaviour {
 assertThat((String) getter.getValue(), is(ValueGetter.VALUE));
 }
 
-    // TODO currently this method depends on order of elements in annotation
-    // FIXME provide sorting of array
 private void assertThatStepsInstancesAre(
 final List&amp;lt;CandidateSteps&amp;gt; candidateSteps,
 final Class&amp;lt;?&amp;gt;... stepsClasses) {
 assertThat(candidateSteps.size(), equalTo(stepsClasses.length));
-for (int i = 0; i &amp;lt; stepsClasses.length; i++) {
-    assertThat(((Steps) candidateSteps.get(i)).instance(),
-    instanceOf(stepsClasses[i]));
+
+// transform candidateSteps to Set of classes
+final Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; candidateStepClasses = new HashSet&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;();
+for (final CandidateSteps step : candidateSteps) {
+candidateStepClasses.add(((Steps) step).instance().getClass());
 }
+assertThat(candidateStepClasses, hasItems(stepsClasses));
 }
 
 &amp;lt; at &amp;gt;Configure()



&lt;/pre&gt;</description>
    <dc:creator>Jan Galinski</dc:creator>
    <dc:date>2013-06-02T09:32:40</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3705">
    <title>[scm-core][8/15] changed order of FooSteps and FooStepsWithDependency to fix console test</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3705</link>
    <description>&lt;pre&gt;commit edbc59faa1b22ee800d588beefd1ec9cc43596c5
Author:     Jan Galinski &amp;lt;jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Wed, 8 May 2013 16:11:32 +0200
Commit:     Jan Galinski &amp;lt;jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Wed, 8 May 2013 16:11:32 +0200

    changed order of FooSteps and FooStepsWithDependency to fix console test

diff --git a/jbehave-needle/src/test/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilderBehaviour.java b/jbehave-needle/src/test/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilderBehaviour.java
index 3938ff9..63e2689 100644
--- a/jbehave-needle/src/test/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilderBehaviour.java
+++ b/jbehave-needle/src/test/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilderBehaviour.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -36,119 +36,163 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class NeedleAnnotationBuilderBehaviour {
 
     &amp;lt; at &amp;gt;Test
     public void shouldBuildConfigurationFromAnnotationsUsingConfigureAndGuiceConverters() {
-AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
+final AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
 AnnotatedUsingConfigureAndNeedleConverters.class);
-Configuration configuration = builderAnnotated.buildConfiguration();
+final Configuration configuration = builderAnnotated
+.buildConfiguration();
 assertThatCustomObjectIsConverted(configuration.parameterConverters());
-assertThatDateIsConvertedWithFormat(configuration.parameterConverters(), new SimpleDateFormat("yyyy-MM-dd"));
+assertThatDateIsConvertedWithFormat(
+configuration.parameterConverters(), new SimpleDateFormat(
+"yyyy-MM-dd"));
 assertThatExamplesTableIsConverted(configuration.parameterConverters());
     }
 
-private void assertThatCustomObjectIsConverted(ParameterConverters parameterConverters) {
-assertThat(((CustomObject) parameterConverters.convert("value", CustomObject.class)).toString(),
-equalTo(new CustomObject("value").toString()));
+    private void assertThatCustomObjectIsConverted(
+    final ParameterConverters parameterConverters) {
+assertThat(((CustomObject) parameterConverters.convert("value",
+CustomObject.class)).toString(), equalTo(new CustomObject(
+"value").toString()));
     }
 
-private void assertThatDateIsConvertedWithFormat(ParameterConverters parameterConverters, DateFormat dateFormat) {
-String date = "2010-10-10";
+    private void assertThatDateIsConvertedWithFormat(
+    final ParameterConverters parameterConverters,
+    final DateFormat dateFormat) {
+final String date = "2010-10-10";
 try {
-assertThat((Date) parameterConverters.convert(date, Date.class), equalTo(dateFormat.parse(date)));
-} catch (ParseException e) {
+    assertThat((Date) parameterConverters.convert(date, Date.class),
+    equalTo(dateFormat.parse(date)));
+} catch (final ParseException e) {
     Assert.fail();
 }
     }
 
-private void assertThatExamplesTableIsConverted(ParameterConverters parameterConverters) {
-String tableAsString = "||one||two||\n" + "|1|2|";
-ExamplesTable table = new ExamplesTable(tableAsString);
+    private void assertThatExamplesTableIsConverted(
+    final ParameterConverters parameterConverters) {
+final String tableAsString = "||one||two||\n" + "|1|2|";
+final ExamplesTable table = new ExamplesTable(tableAsString);
 assertThat(table.getHeaders(), hasItems("one", "two"));
     }
 
     &amp;lt; at &amp;gt;Test
     public void shouldBuildDefaultConfigurationIfAnnotationOrAnnotatedValuesNotPresent() {
-AnnotationBuilder builderNotAnnotated = new NeedleAnnotationBuilder(NotAnnotated.class);
-assertThatConfigurationIs(builderNotAnnotated.buildConfiguration(), new MostUsefulConfiguration());
-AnnotationBuilder builderAnnotatedWithoutModules = new NeedleAnnotationBuilder(AnnotatedWithoutInjectors.class);
-assertThatConfigurationIs(builderAnnotatedWithoutModules.buildConfiguration(), new MostUsefulConfiguration());
-}
-
-private void assertThatConfigurationIs(Configuration builtConfiguration, Configuration defaultConfiguration) {
-assertThat(builtConfiguration.failureStrategy(), instanceOf(defaultConfiguration.failureStrategy().getClass()));
-assertThat(builtConfiguration.storyLoader(), instanceOf(defaultConfiguration.storyLoader().getClass()));
-assertThat(builtConfiguration.stepPatternParser(), instanceOf(defaultConfiguration.stepPatternParser()
-.getClass()));
-assertThat(builtConfiguration.storyReporterBuilder().formats(), equalTo(defaultConfiguration
-.storyReporterBuilder().formats()));
-assertThat(builtConfiguration.storyReporterBuilder().outputDirectory(), equalTo(defaultConfiguration
-.storyReporterBuilder().outputDirectory()));
-assertThat(builtConfiguration.storyReporterBuilder().viewResources(), equalTo(defaultConfiguration
-.storyReporterBuilder().viewResources()));
-assertThat(builtConfiguration.storyReporterBuilder().reportFailureTrace(), equalTo(defaultConfiguration
+final AnnotationBuilder builderNotAnnotated = new NeedleAnnotationBuilder(
+NotAnnotated.class);
+assertThatConfigurationIs(builderNotAnnotated.buildConfiguration(),
+new MostUsefulConfiguration());
+final AnnotationBuilder builderAnnotatedWithoutModules = new NeedleAnnotationBuilder(
+AnnotatedWithoutInjectors.class);
+assertThatConfigurationIs(
+builderAnnotatedWithoutModules.buildConfiguration(),
+new MostUsefulConfiguration());
+    }
+
+    private void assertThatConfigurationIs(
+    final Configuration builtConfiguration,
+    final Configuration defaultConfiguration) {
+assertThat(builtConfiguration.failureStrategy(),
+instanceOf(defaultConfiguration.failureStrategy().getClass()));
+assertThat(builtConfiguration.storyLoader(),
+instanceOf(defaultConfiguration.storyLoader().getClass()));
+assertThat(builtConfiguration.stepPatternParser(),
+instanceOf(defaultConfiguration.stepPatternParser().getClass()));
+assertThat(builtConfiguration.storyReporterBuilder().formats(),
+equalTo(defaultConfiguration.storyReporterBuilder().formats()));
+assertThat(builtConfiguration.storyReporterBuilder().outputDirectory(),
+equalTo(defaultConfiguration.storyReporterBuilder()
+.outputDirectory()));
+assertThat(builtConfiguration.storyReporterBuilder().viewResources(),
+equalTo(defaultConfiguration.storyReporterBuilder()
+.viewResources()));
+assertThat(builtConfiguration.storyReporterBuilder()
+.reportFailureTrace(), equalTo(defaultConfiguration
 .storyReporterBuilder().reportFailureTrace()));
     }
 
     &amp;lt; at &amp;gt;Test
     public void shouldBuildCandidateStepsFromAnnotationsUsingNeedle() {
-AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(AnnotatedUsingNeedle.class);
-Configuration configuration = builderAnnotated.buildConfiguration();
-assertTrue(builderAnnotated.buildCandidateSteps(configuration).isEmpty());
+final AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
+AnnotatedUsingNeedle.class);
+final Configuration configuration = builderAnnotated
+.buildConfiguration();
+assertTrue(builderAnnotated.buildCandidateSteps(configuration)
+.isEmpty());
     }
 
     &amp;lt; at &amp;gt;Test
     public void shouldBuildCandidateStepsFromAnnotationsUsingStepsAndNeedle() {
-AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(AnnotatedUsingStepsAndNeedle.class);
-Configuration configuration = builderAnnotated.buildConfiguration();
-assertThatStepsInstancesAre(builderAnnotated.buildCandidateSteps(configuration), FooSteps.class);
+final AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
+AnnotatedUsingStepsAndNeedle.class);
+final Configuration configuration = builderAnnotated
+.buildConfiguration();
+assertThatStepsInstancesAre(
+builderAnnotated.buildCandidateSteps(configuration),
+FooSteps.class);
     }
 
     &amp;lt; at &amp;gt;Test
     public void shouldBuildCandidateStepsFromAnnotationsUsingStepsAndGuiceAndConverters() {
-AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
+final AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
 AnnotatedUsingConfigureAndNeedleConverters.class);
-Configuration configuration = builderAnnotated.buildConfiguration();
-assertThatStepsInstancesAre(builderAnnotated.buildCandidateSteps(configuration), FooSteps.class);
+final Configuration configuration = builderAnnotated
+.buildConfiguration();
+assertThatStepsInstancesAre(
+builderAnnotated.buildCandidateSteps(configuration),
+FooSteps.class);
     }
 
     &amp;lt; at &amp;gt;Test
     public void shouldBuildEmptyStepsListIfAnnotationOrAnnotatedValuesNotPresent() {
-AnnotationBuilder builderNotAnnotated = new NeedleAnnotationBuilder(NotAnnotated.class);
+final AnnotationBuilder builderNotAnnotated = new NeedleAnnotationBuilder(
+NotAnnotated.class);
 assertThatStepsInstancesAre(builderNotAnnotated.buildCandidateSteps());
 
-AnnotationBuilder builderAnnotatedWithoutLocations = new NeedleAnnotationBuilder(
+final AnnotationBuilder builderAnnotatedWithoutLocations = new NeedleAnnotationBuilder(
 AnnotatedWithoutInjectors.class);
-assertThatStepsInstancesAre(builderAnnotatedWithoutLocations.buildCandidateSteps());
+assertThatStepsInstancesAre(builderAnnotatedWithoutLocations
+.buildCandidateSteps());
     }
 
     &amp;lt; at &amp;gt;Test
     public void shouldBuildStepsList() {
-AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(AnnotatedMultipleSteps.class);
-List&amp;lt;CandidateSteps&amp;gt; actual = builderAnnotated.buildCandidateSteps();
-assertThatStepsInstancesAre(actual, FooSteps.class, FooStepsWithDependency.class);
+final AnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
+AnnotatedMultipleSteps.class);
+final List&amp;lt;CandidateSteps&amp;gt; actual = builderAnnotated
+.buildCandidateSteps();
+assertThatStepsInstancesAre(actual, FooStepsWithDependency.class,
+FooSteps.class);
     }
 
     &amp;lt; at &amp;gt;Test
     public void shouldCreateOnlyOneContainerForMultipleBuildInvocations() {
-NeedleAnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(AnnotatedUsingStepsAndNeedle.class);
+final NeedleAnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
+AnnotatedUsingStepsAndNeedle.class);
 builderAnnotated.buildConfiguration();
 assertTrue(!builderAnnotated.getProvider().isEmpty());
     }
 
     &amp;lt; at &amp;gt;Test
     public void shouldSupplyInjectors() {
-NeedleAnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(AnnotatedWithStepsWithDependency.class);
-List&amp;lt;CandidateSteps&amp;gt; buildCandidateSteps = builderAnnotated.buildCandidateSteps();
-assertThatStepsInstancesAre(buildCandidateSteps, FooStepsWithDependency.class);
-ValueGetter getter = ((FooStepsWithDependency) ((Steps) buildCandidateSteps.get(0)).instance()).getGetter();
+final NeedleAnnotationBuilder builderAnnotated = new NeedleAnnotationBuilder(
+AnnotatedWithStepsWithDependency.class);
+final List&amp;lt;CandidateSteps&amp;gt; buildCandidateSteps = builderAnnotated
+.buildCandidateSteps();
+assertThatStepsInstancesAre(buildCandidateSteps,
+FooStepsWithDependency.class);
+final ValueGetter getter = ((FooStepsWithDependency) ((Steps) buildCandidateSteps
+.get(0)).instance()).getGetter();
 assertNotNull(getter);
 assertThat((String) getter.getValue(), is(ValueGetter.VALUE));
     }
 
     // TODO currently this method depends on order of elements in annotation
     // FIXME provide sorting of array
-private void assertThatStepsInstancesAre(List&amp;lt;CandidateSteps&amp;gt; candidateSteps, Class&amp;lt;?&amp;gt;... stepsClasses) {
+    private void assertThatStepsInstancesAre(
+    final List&amp;lt;CandidateSteps&amp;gt; candidateSteps,
+    final Class&amp;lt;?&amp;gt;... stepsClasses) {
 assertThat(candidateSteps.size(), equalTo(stepsClasses.length));
 for (int i = 0; i &amp;lt; stepsClasses.length; i++) {
-assertThat(((Steps) candidateSteps.get(i)).instance(), instanceOf(stepsClasses[i]));
+    assertThat(((Steps) candidateSteps.get(i)).instance(),
+    instanceOf(stepsClasses[i]));
 }
     }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -165,7 +209,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class NeedleAnnotationBuilderBehaviour {
 
     }
 
-&amp;lt; at &amp;gt;Configure(parameterConverters = { MyExampleTableConverter.class, MyDateConverter.class, CustomConverter.class })
+    &amp;lt; at &amp;gt;Configure(parameterConverters = { MyExampleTableConverter.class,
+    MyDateConverter.class, CustomConverter.class })
     &amp;lt; at &amp;gt;UsingSteps(instances = { FooSteps.class })
     &amp;lt; at &amp;gt;UsingNeedle(provider = { ValueGetterProvider.class })
     private static class AnnotatedUsingConfigureAndNeedleConverters {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -198,23 +243,25 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class NeedleAnnotationBuilderBehaviour {
 
     public static class CustomConverter implements ParameterConverter {
 
-public boolean accept(Type type) {
+public boolean accept(final Type type) {
     return ((Class&amp;lt;?&amp;gt;) type).isAssignableFrom(CustomObject.class);
 }
 
-public Object convertValue(String value, Type type) {
+public Object convertValue(final String value, final Type type) {
     return new CustomObject(value);
 }
     }
 
-public static class MyExampleTableConverter extends ParameterConverters.ExamplesTableConverter {
+    public static class MyExampleTableConverter extends
+    ParameterConverters.ExamplesTableConverter {
 
 public MyExampleTableConverter() {
 }
 
     }
 
-public static class MyDateConverter extends ParameterConverters.DateConverter {
+    public static class MyDateConverter extends
+    ParameterConverters.DateConverter {
 
 public MyDateConverter() {
     super(new SimpleDateFormat("yyyy-MM-dd"));
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -225,7 +272,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class NeedleAnnotationBuilderBehaviour {
 
 private final String value;
 
-public CustomObject(String value) {
+public CustomObject(final String value) {
     this.value = value;
 }
 



&lt;/pre&gt;</description>
    <dc:creator>Jan Galinski</dc:creator>
    <dc:date>2013-06-02T09:32:40</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3704">
    <title>[scm-core][6/15] Removed logging and made TraderSteps access bean like</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3704</link>
    <description>&lt;pre&gt;commit fe64771a0671b7849af0680d47fc93756233337b
Author:     zambrovski &amp;lt;simon.zambrovski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Mon, 6 May 2013 23:22:05 +0200
Commit:     zambrovski &amp;lt;simon.zambrovski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Mon, 6 May 2013 23:22:05 +0200

    Removed logging and made TraderSteps access bean like

diff --git a/examples/pom.xml b/examples/pom.xml
index cab63cf..a303d05 100755
--- a/examples/pom.xml
+++ b/examples/pom.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -34,6 +34,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
     &amp;lt;module&amp;gt;trader-testng&amp;lt;/module&amp;gt;
     &amp;lt;module&amp;gt;trader-i18n&amp;lt;/module&amp;gt;
     &amp;lt;module&amp;gt;trader-guice&amp;lt;/module&amp;gt;
+    &amp;lt;module&amp;gt;trader-needle&amp;lt;/module&amp;gt;
     &amp;lt;module&amp;gt;trader-pico&amp;lt;/module&amp;gt;
     &amp;lt;module&amp;gt;trader-spring&amp;lt;/module&amp;gt;
     &amp;lt;module&amp;gt;trader-weld&amp;lt;/module&amp;gt;
diff --git a/examples/trader/src/main/java/org/jbehave/examples/trader/steps/TraderSteps.java b/examples/trader/src/main/java/org/jbehave/examples/trader/steps/TraderSteps.java
index 382ead3..e677b25 100755
--- a/examples/trader/src/main/java/org/jbehave/examples/trader/steps/TraderSteps.java
+++ b/examples/trader/src/main/java/org/jbehave/examples/trader/steps/TraderSteps.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -33,9 +33,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 
 /**
- * POJO holding the candidate steps for the trader example.  
- * The {&amp;lt; at &amp;gt;link CandidateSteps} instance wrapping this are created via the {&amp;lt; at &amp;gt;link InstanceStepsFactory}
- * in the {&amp;lt; at &amp;gt;link TraderStory}.
+ * POJO holding the candidate steps for the trader example. The {&amp;lt; at &amp;gt;link CandidateSteps} instance wrapping this are
+ * created via the {&amp;lt; at &amp;gt;link InstanceStepsFactory} in the {&amp;lt; at &amp;gt;link TraderStory}.
  */
 public class TraderSteps {
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -57,6 +56,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class TraderSteps {
 this.service = service;
 }
 
+public TradingService getService() {
+return this.service;
+}
+
 &amp;lt; at &amp;gt;Given("a date of %date")
 public void aDate(Date date) {
 this.date = date;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -103,7 +106,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class TraderSteps {
 public void theTradersActivityIs(ExamplesTable activityTable) {
 for (int i = 0; i &amp;lt; activityTable.getRowCount(); i++) {
 Parameters row = activityTable.withDefaults(this.ranksTable.getRowAsParameters(i)).getRowAsParameters(i);
-            System.out.println(row.valueAs("name", Trader.class).getName() + " ("+row.valueAs("rank", String.class, "N/A")+") has done " + row.valueAs("trades", Integer.class) + " trades");            
+System.out.println(row.valueAs("name", Trader.class).getName() + " ("
++ row.valueAs("rank", String.class, "N/A") + ") has done " + row.valueAs("trades", Integer.class)
++ " trades");
 }
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -121,7 +126,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class TraderSteps {
 for (Map&amp;lt;String, String&amp;gt; row : rows) {
 String name = row.get("name");
 String rank = row.get("rank");
-            traders.add(service.newTrader(name, rank));
+traders.add(getService().newTrader(name, rank));
 }
 Collections.sort(traders);
 return traders;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -140,19 +145,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class TraderSteps {
 }
 
 &amp;lt; at &amp;gt;Given("a stock of symbol %symbol and a threshold of %threshold")
-    &amp;lt; at &amp;gt;Alias("a stock of &amp;lt;symbol&amp;gt; and a &amp;lt;threshold&amp;gt;") // alias used with examples table
+&amp;lt; at &amp;gt;Alias("a stock of &amp;lt;symbol&amp;gt; and a &amp;lt;threshold&amp;gt;")
+// alias used with examples table
 public void aStock(&amp;lt; at &amp;gt;Named("symbol") String symbol, &amp;lt; at &amp;gt;Named("threshold") double threshold) {
-        stock = service.newStock(symbol, threshold);
+stock = getService().newStock(symbol, threshold);
 }
 
 &amp;lt; at &amp;gt;When("the stock is traded at price %price")
 &amp;lt; at &amp;gt;Aliases(values = { "the stock is sold at price %price", "the stock is exchanged at price %price",
-            "the stock is traded with &amp;lt;price&amp;gt;"}) // multiple aliases, one used with examples table
+"the stock is traded with &amp;lt;price&amp;gt;" })
+// multiple aliases, one used with examples table
 public void theStockIsTraded(&amp;lt; at &amp;gt;Named("price") double price) {
 stock.tradeAt(price);
 }
 
-    &amp;lt; at &amp;gt;Given("the alert status is %status") // shows that matching pattern need only be unique for step type
+&amp;lt; at &amp;gt;Given("the alert status is %status")
+// shows that matching pattern need only be unique for step type
 public void theAlertStatusIsReset(&amp;lt; at &amp;gt;Named("status") String status) {
 if (AlertStatus.OFF.name().startsWith(status) &amp;amp;&amp;amp; stock != null) {
 stock.resetAlert();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -160,12 +168,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class TraderSteps {
 }
 
 &amp;lt; at &amp;gt;Then("the alert status is %status")
-    &amp;lt; at &amp;gt;Alias("the trader is alerted with &amp;lt;status&amp;gt;") // alias used with examples table
+&amp;lt; at &amp;gt;Alias("the trader is alerted with &amp;lt;status&amp;gt;")
+// alias used with examples table
 public void theAlertStatusIs(&amp;lt; at &amp;gt;Named("status") String status) {
 assertThat(stock.getStatus().name(), equalTo(status));
 }
 
-    &amp;lt; at &amp;gt;Then(value="the alert status is currently %status", priority=1) // prioritise over potential match with previous method
+&amp;lt; at &amp;gt;Then(value = "the alert status is currently %status", priority = 1)
+// prioritise over potential match with previous method
 public void theAlertStatusIsCurrently(&amp;lt; at &amp;gt;Named("status") String status) {
 assertThat(stock.getStatus().name(), equalTo(status));
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -192,9 +202,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class TraderSteps {
 }
 
 static TraderPersister mockTradePersister() {
-return new TraderPersister(new Trader("Mauro", asList(new Stock("STK1",
-10.d))));
+return new TraderPersister(new Trader("Mauro", asList(new Stock("STK1", 10.d))));
 }
 
-
 }
diff --git a/jbehave-needle/src/main/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilder.java b/jbehave-needle/src/main/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilder.java
index 1ce71c0..371f95f 100644
--- a/jbehave-needle/src/main/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilder.java
+++ b/jbehave-needle/src/main/java/org/jbehave/core/configuration/needle/NeedleAnnotationBuilder.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -16,8 +16,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import org.jbehave.core.configuration.PrintStreamAnnotationMonitor;
 import org.jbehave.core.steps.InjectableStepsFactory;
 import org.jbehave.core.steps.needle.NeedleStepsFactory;
 import org.jbehave.core.steps.needle.configuration.CreateInstanceByDefaultConstructor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import de.akquinet.jbosscc.needle.injection.InjectionProvider;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -31,7 +29,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import de.akquinet.jbosscc.needle.injection.InjectionProvider;
  */
 public class NeedleAnnotationBuilder extends AnnotationBuilder {
 
-private final Logger logger = LoggerFactory.getLogger(NeedleAnnotationBuilder.class);
 private final Set&amp;lt;InjectionProvider&amp;lt;?&amp;gt;&amp;gt; provider = new HashSet&amp;lt;InjectionProvider&amp;lt;?&amp;gt;&amp;gt;();
 private final Set&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt; stepsClasses = new HashSet&amp;lt;Class&amp;lt;?&amp;gt;&amp;gt;();
 private NeedleStepsFactory factory;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -46,9 +43,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class NeedleAnnotationBuilder extends AnnotationBuilder {
 
 &amp;lt; at &amp;gt;Override
 public Configuration buildConfiguration() throws AnnotationRequired {
-if (logger.isDebugEnabled()) {
-logger.debug("Configuration built.");
-}
 
 final AnnotationFinder finder = annotationFinder();
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -78,9 +72,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class NeedleAnnotationBuilder extends AnnotationBuilder {
 
 &amp;lt; at &amp;gt;Override
 public InjectableStepsFactory buildStepsFactory(Configuration configuration) {
-if (logger.isDebugEnabled()) {
-logger.debug("Factory constructed.");
-}
 this.factory = new NeedleStepsFactory(configuration, provider, stepsClasses.toArray(new Class&amp;lt;?&amp;gt;[stepsClasses
 .size()]));
 return factory;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -89,9 +80,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class NeedleAnnotationBuilder extends AnnotationBuilder {
 &amp;lt; at &amp;gt;Override
 &amp;lt; at &amp;gt;SuppressWarnings("unchecked")
 protected &amp;lt;T, V extends T&amp;gt; T instanceOf(Class&amp;lt;T&amp;gt; type, Class&amp;lt;V&amp;gt; ofClass) {
-if (logger.isDebugEnabled()) {
-logger.debug("Instance of {} {}", type, ofClass);
-}
 /*
  * This allow usage of the factory only after step factory is constructed. Current implementation only supports
  * creation injection into steps. Further improvement will be to provide a needle factory capable of creating
diff --git a/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/NeedleStepsFactory.java b/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/NeedleStepsFactory.java
index 2cae6d1..5e368a1 100644
--- a/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/NeedleStepsFactory.java
+++ b/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/NeedleStepsFactory.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -21,8 +21,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import org.jbehave.core.steps.Steps;
 import org.jbehave.core.steps.needle.configuration.CollectInjectionProvidersFromStepsInstance;
 import org.jbehave.core.steps.needle.configuration.CreateInstanceByDefaultConstructor;
 import org.jbehave.core.steps.needle.configuration.JBehaveNeedleConfiguration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import de.akquinet.jbosscc.needle.NeedleTestcase;
 import de.akquinet.jbosscc.needle.injection.InjectionProvider;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -38,7 +36,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class NeedleStepsFactory extends NeedleTestcase implements InjectableStep
 
 private final Map&amp;lt;Class&amp;lt;?&amp;gt;, Object&amp;gt; cachedStepsInstances = new LinkedHashMap&amp;lt;Class&amp;lt;?&amp;gt;, Object&amp;gt;();
 
-private final Logger logger = LoggerFactory.getLogger(NeedleStepsFactory.class);
 private final Configuration configuration;
 private Class&amp;lt;?&amp;gt;[] steps;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -98,9 +95,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class NeedleStepsFactory extends NeedleTestcase implements InjectableStep
 public Object createInstanceOfType(Class&amp;lt;?&amp;gt; type) {
 final Object instance = cachedStepsInstances.get(type);
 if (instance == null) {
-if (logger.isTraceEnabled()) {
-logger.debug("createInstanceOfType(): " + type.getCanonicalName());
-}
 try {
 final Object stepsInstance = CreateInstanceByDefaultConstructor.INSTANCE.apply(type);
 final InjectionProvider&amp;lt;?&amp;gt;[] foundProviders = CollectInjectionProvidersFromStepsInstance.INSTANCE
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -168,7 +162,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class NeedleStepsFactory extends NeedleTestcase implements InjectableStep
 /**
  * Read injection providers configuration from a resource.
  * 
- * &amp;lt; at &amp;gt;param resourceName resource name
+ * &amp;lt; at &amp;gt;param resourceName
+ *            resource name
  * &amp;lt; at &amp;gt;return injection providers.
  */
 static InjectionProvider&amp;lt;?&amp;gt;[] setUpInjectionProviders(final String resourceName) {
diff --git a/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/CollectInjectionProvidersFromStepsInstance.java b/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/CollectInjectionProvidersFromStepsInstance.java
index 833c323..373a630 100644
--- a/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/CollectInjectionProvidersFromStepsInstance.java
+++ b/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/CollectInjectionProvidersFromStepsInstance.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -7,9 +7,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import java.util.Set;
 
 import org.jbehave.core.annotations.needle.InjectionProviderInstancesSupplier;
 import org.jbehave.core.annotations.needle.NeedleInjectionProvider;
-import org.jbehave.core.steps.needle.NeedleStepsFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import de.akquinet.jbosscc.needle.injection.InjectionProvider;
 import de.akquinet.jbosscc.needle.reflection.ReflectionUtil;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -27,11 +24,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public enum CollectInjectionProvidersFromStepsInstance {
 INSTANCE;
 
 /**
- * Logger for the factory.
- */
-private final Logger logger = LoggerFactory.getLogger(NeedleStepsFactory.class);
-
-/**
  * Collect providers direct in the step definition.
  * 
  * &amp;lt; at &amp;gt;param instance
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -58,9 +50,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public enum CollectInjectionProvidersFromStepsInstance {
 throw new IllegalStateException(e);
 }
 }
-if (logger.isTraceEnabled()) {
-logger.trace("Adding {} InjectionProvider instances.", providers.size());
-}
 
 return providers.toArray(new InjectionProvider&amp;lt;?&amp;gt;[providers.size()]);
 }
diff --git a/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/CreateInstanceByDefaultConstructor.java b/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/CreateInstanceByDefaultConstructor.java
index bdacf5a..3bbc2dc 100644
--- a/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/CreateInstanceByDefaultConstructor.java
+++ b/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/CreateInstanceByDefaultConstructor.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1,7 +1,5 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 package org.jbehave.core.steps.needle.configuration;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Instantiates new java object by default constructor
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -15,12 +13,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public enum CreateInstanceByDefaultConstructor {
  */
 INSTANCE;
 
-private final Logger logger = LoggerFactory.getLogger(this.getClass());
-
 public final &amp;lt;T&amp;gt; T apply(final Class&amp;lt;T&amp;gt; type) {
 try {
 final T newInstance = type.getConstructor().newInstance();
-logger.debug("newInstance by DefaultConstructor: " + newInstance);
 return newInstance;
 } catch (final Exception e) {
 throw new IllegalStateException("Can not instantiate Instance by Default Constructor.", e);
diff --git a/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/JBehaveNeedleConfiguration.java b/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/JBehaveNeedleConfiguration.java
index 51212c2..7d0107e 100644
--- a/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/JBehaveNeedleConfiguration.java
+++ b/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/JBehaveNeedleConfiguration.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5,8 +5,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import java.util.ResourceBundle;
 import java.util.Set;
 
 import org.jbehave.core.annotations.needle.InjectionProviderInstancesSupplier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import de.akquinet.jbosscc.needle.injection.InjectionProvider;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -22,9 +20,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public class JBehaveNeedleConfiguration {
  */
 public static final String RESOURCE_JBEHAVE_NEEDLE = "jbehave-needle";
 
-&amp;lt; at &amp;gt;SuppressWarnings("unused")
-private final Logger logger = LoggerFactory.getLogger(this.getClass());
-
 private final LoadResourceBundle loadResourceBundle = LoadResourceBundle.INSTANCE;
 private final ReadInjectionProviderClassNames readInjectionProviderClassNames = ReadInjectionProviderClassNames.INSTANCE;
 private final CreateInstanceByDefaultConstructor createInstance = CreateInstanceByDefaultConstructor.INSTANCE;
diff --git a/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/LoadResourceBundle.java b/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/LoadResourceBundle.java
index a097ded..02d004b 100644
--- a/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/LoadResourceBundle.java
+++ b/jbehave-needle/src/main/java/org/jbehave/core/steps/needle/configuration/LoadResourceBundle.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4,9 +4,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; import java.util.Enumeration;
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 /**
  * Null safe Resource Loader. If ResourceBundle does not exist, an empty Bundle is returned.
  * 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -38,8 +35,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public enum LoadResourceBundle {
 }
 };
 
-private final Logger logger = LoggerFactory.getLogger(LoadResourceBundle.class);
-
 public final ResourceBundle apply(final String resourceName) {
 if (resourceName == null || "".equals(resourceName.trim())) {
 throw new IllegalArgumentException("resourceName must not be null or empty!");
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -48,7 +43,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; public enum LoadResourceBundle {
 try {
 return ResourceBundle.getBundle(resourceName);
 } catch (final MissingResourceException e) {
-logger.warn(e.getMessage());
 return EMPTY_RESOURCE_BUNDLE;
 }
 }



&lt;/pre&gt;</description>
    <dc:creator>zambrovski</dc:creator>
    <dc:date>2013-06-02T09:32:38</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.java.jbehave.scm/3703">
    <title>[scm-core][5/15] New exaple added</title>
    <link>http://comments.gmane.org/gmane.comp.java.jbehave.scm/3703</link>
    <description>&lt;pre&gt;commit aeed625f0a0cce051087c2dc2110809a3eb45788
Author:     zambrovski &amp;lt;simon.zambrovski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
AuthorDate: Mon, 6 May 2013 23:21:02 +0200
Commit:     zambrovski &amp;lt;simon.zambrovski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org&amp;gt;
CommitDate: Mon, 6 May 2013 23:21:02 +0200

    New exaple added

diff --git a/examples/trader-needle/pom.xml b/examples/trader-needle/pom.xml
new file mode 100644
index 0000000..475f951
--- /dev/null
+++ b/examples/trader-needle/pom.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,54 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;
+&amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
+&amp;lt;parent&amp;gt;
+&amp;lt;groupId&amp;gt;org.jbehave&amp;lt;/groupId&amp;gt;
+&amp;lt;artifactId&amp;gt;jbehave-examples&amp;lt;/artifactId&amp;gt;
+&amp;lt;version&amp;gt;3.8-SNAPSHOT&amp;lt;/version&amp;gt;
+&amp;lt;/parent&amp;gt;
+&amp;lt;artifactId&amp;gt;jbehave-trader-needle-example&amp;lt;/artifactId&amp;gt;
+&amp;lt;name&amp;gt;JBehave Trader Needle Example&amp;lt;/name&amp;gt;
+
+&amp;lt;dependencies&amp;gt;
+&amp;lt;dependency&amp;gt;
+&amp;lt;groupId&amp;gt;org.jbehave&amp;lt;/groupId&amp;gt;
+&amp;lt;artifactId&amp;gt;jbehave-trader-example&amp;lt;/artifactId&amp;gt;
+&amp;lt;version&amp;gt;${project.version}&amp;lt;/version&amp;gt;
+&amp;lt;/dependency&amp;gt;
+&amp;lt;dependency&amp;gt;
+&amp;lt;groupId&amp;gt;org.jbehave&amp;lt;/groupId&amp;gt;
+&amp;lt;artifactId&amp;gt;jbehave-needle&amp;lt;/artifactId&amp;gt;
+&amp;lt;version&amp;gt;${project.version}&amp;lt;/version&amp;gt;
+&amp;lt;/dependency&amp;gt;
+&amp;lt;dependency&amp;gt;
+&amp;lt;groupId&amp;gt;javax.inject&amp;lt;/groupId&amp;gt;
+&amp;lt;artifactId&amp;gt;javax.inject&amp;lt;/artifactId&amp;gt;
+&amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;
+&amp;lt;/dependency&amp;gt;
+&amp;lt;/dependencies&amp;gt;
+
+&amp;lt;build&amp;gt;
+&amp;lt;plugins&amp;gt;
+&amp;lt;plugin&amp;gt;
+&amp;lt;groupId&amp;gt;org.jbehave&amp;lt;/groupId&amp;gt;
+&amp;lt;artifactId&amp;gt;jbehave-maven-plugin&amp;lt;/artifactId&amp;gt;
+&amp;lt;executions&amp;gt;
+&amp;lt;execution&amp;gt;
+&amp;lt;id&amp;gt;embeddable-stories&amp;lt;/id&amp;gt;
+&amp;lt;phase&amp;gt;integration-test&amp;lt;/phase&amp;gt;
+&amp;lt;configuration&amp;gt;
+&amp;lt;includes&amp;gt;
+&amp;lt;include&amp;gt;**/TraderStoriesUsingNeedle.java&amp;lt;/include&amp;gt;
+&amp;lt;/includes&amp;gt;
+&amp;lt;ignoreFailureInStories&amp;gt;true&amp;lt;/ignoreFailureInStories&amp;gt;
+&amp;lt;ignoreFailureInView&amp;gt;true&amp;lt;/ignoreFailureInView&amp;gt;
+&amp;lt;/configuration&amp;gt;
+&amp;lt;goals&amp;gt;
+&amp;lt;goal&amp;gt;run-stories-as-embeddables&amp;lt;/goal&amp;gt;
+&amp;lt;/goals&amp;gt;
+&amp;lt;/execution&amp;gt;
+&amp;lt;/executions&amp;gt;
+&amp;lt;/plugin&amp;gt;
+&amp;lt;/plugins&amp;gt;
+&amp;lt;/build&amp;gt;
+&amp;lt;/project&amp;gt;
diff --git a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedEmbedderUsingNeedle.java b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedEmbedderUsingNeedle.java
new file mode 100644
index 0000000..83b69f2
--- /dev/null
+++ b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedEmbedderUsingNeedle.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,37 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.examples.trader.needle;
+
+import static org.jbehave.core.io.CodeLocations.codeLocationFromPath;
+
+import java.util.List;
+
+import org.jbehave.core.InjectableEmbedder;
+import org.jbehave.core.annotations.Configure;
+import org.jbehave.core.annotations.UsingEmbedder;
+import org.jbehave.core.annotations.needle.UsingNeedle;
+import org.jbehave.core.embedder.Embedder;
+import org.jbehave.core.io.StoryFinder;
+import org.jbehave.core.junit.needle.NeedleAnnotatedEmbedderRunner;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Run stories via annotated embedder configuration and steps using needle. The textual trader stories are exactly the
+ * same ones found in the jbehave-trader-example. Here we are only concerned with using the container to compose the
+ * configuration and the steps instances.
+ */
+&amp;lt; at &amp;gt;RunWith(NeedleAnnotatedEmbedderRunner.class)
+&amp;lt; at &amp;gt;Configure
+&amp;lt; at &amp;gt;UsingNeedle
+&amp;lt; at &amp;gt;UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = true, ignoreFailureInView = true)
+public class AnnotatedEmbedderUsingNeedle extends InjectableEmbedder {
+
+&amp;lt; at &amp;gt;Test
+public void run() {
+injectedEmbedder().runStoriesAsPaths(storyPaths());
+}
+
+protected List&amp;lt;String&amp;gt; storyPaths() {
+return new StoryFinder().findPaths(codeLocationFromPath("../trader/src/main/java"), "**/*.story", "");
+}
+
+}
diff --git a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedEmbedderUsingNeedleAndSteps.java b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedEmbedderUsingNeedleAndSteps.java
new file mode 100644
index 0000000..f17730b
--- /dev/null
+++ b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedEmbedderUsingNeedleAndSteps.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,46 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.examples.trader.needle;
+
+import static org.jbehave.core.io.CodeLocations.codeLocationFromPath;
+
+import java.util.List;
+
+import org.jbehave.core.InjectableEmbedder;
+import org.jbehave.core.annotations.Configure;
+import org.jbehave.core.annotations.UsingEmbedder;
+import org.jbehave.core.annotations.UsingSteps;
+import org.jbehave.core.annotations.needle.UsingNeedle;
+import org.jbehave.core.embedder.Embedder;
+import org.jbehave.core.io.StoryFinder;
+import org.jbehave.core.junit.needle.NeedleAnnotatedEmbedderRunner;
+import org.jbehave.examples.trader.steps.AndSteps;
+import org.jbehave.examples.trader.steps.BeforeAfterSteps;
+import org.jbehave.examples.trader.steps.CalendarSteps;
+import org.jbehave.examples.trader.steps.PendingSteps;
+import org.jbehave.examples.trader.steps.PriorityMatchingSteps;
+import org.jbehave.examples.trader.steps.SandpitSteps;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Run stories via annotated embedder configuration and steps using Needle. The textual trader stories are exactly the
+ * same ones found in the jbehave-trader-example. Here we are only concerned with using the container to compose the
+ * configuration and the steps instances.
+ */
+&amp;lt; at &amp;gt;RunWith(NeedleAnnotatedEmbedderRunner.class)
+&amp;lt; at &amp;gt;Configure()
+&amp;lt; at &amp;gt;UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = true, ignoreFailureInView = true)
+&amp;lt; at &amp;gt;UsingSteps(instances = { NeedleTraderSteps.class, BeforeAfterSteps.class, AndSteps.class, CalendarSteps.class,
+PendingSteps.class, PriorityMatchingSteps.class, SandpitSteps.class })
+&amp;lt; at &amp;gt;UsingNeedle
+public class AnnotatedEmbedderUsingNeedleAndSteps extends InjectableEmbedder {
+
+&amp;lt; at &amp;gt;Test
+public void run() {
+injectedEmbedder().runStoriesAsPaths(storyPaths());
+}
+
+protected List&amp;lt;String&amp;gt; storyPaths() {
+return new StoryFinder().findPaths(codeLocationFromPath("../trader/src/main/java"), "**/*.story", "");
+}
+
+}
diff --git a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedPathRunnerUsingNeedle.java b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedPathRunnerUsingNeedle.java
new file mode 100644
index 0000000..ad82399
--- /dev/null
+++ b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/AnnotatedPathRunnerUsingNeedle.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,23 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.examples.trader.needle;
+
+import org.jbehave.core.annotations.Configure;
+import org.jbehave.core.annotations.UsingEmbedder;
+import org.jbehave.core.annotations.UsingPaths;
+import org.jbehave.core.annotations.needle.UsingNeedle;
+import org.jbehave.core.embedder.Embedder;
+import org.jbehave.core.junit.needle.NeedleAnnotatedPathRunner;
+import org.junit.runner.RunWith;
+
+/**
+ * Run stories via annotated embedder configuration and steps using Needle. The textual trader stories are exactly the
+ * same ones found in the jbehave-trader-example. Here we are only concerned with using the container to compose the
+ * configuration and the steps instances.
+ */
+&amp;lt; at &amp;gt;RunWith(NeedleAnnotatedPathRunner.class)
+&amp;lt; at &amp;gt;Configure
+&amp;lt; at &amp;gt;UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = true, ignoreFailureInView = true)
+&amp;lt; at &amp;gt;UsingNeedle
+&amp;lt; at &amp;gt;UsingPaths(searchIn = "../trader/src/main/java", includes = { "**/*.story" }, excludes = { "**/examples_table*.story" })
+public class AnnotatedPathRunnerUsingNeedle {
+
+}
diff --git a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/InheritingAnnotatedEmbedderUsingSteps.java b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/InheritingAnnotatedEmbedderUsingSteps.java
new file mode 100644
index 0000000..2d5200e
--- /dev/null
+++ b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/InheritingAnnotatedEmbedderUsingSteps.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,33 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.examples.trader.needle;
+
+import static org.jbehave.core.io.CodeLocations.codeLocationFromPath;
+
+import java.util.List;
+
+import org.jbehave.core.annotations.UsingSteps;
+import org.jbehave.core.io.StoryFinder;
+import org.jbehave.examples.trader.steps.AndSteps;
+import org.jbehave.examples.trader.steps.BeforeAfterSteps;
+import org.jbehave.examples.trader.steps.CalendarSteps;
+import org.jbehave.examples.trader.steps.PendingSteps;
+import org.jbehave.examples.trader.steps.PriorityMatchingSteps;
+import org.jbehave.examples.trader.steps.SandpitSteps;
+import org.junit.Test;
+
+/**
+ * Here we show how configuation annotations can be split across parent-child hierarchies
+ */
+&amp;lt; at &amp;gt;UsingSteps(instances = { NeedleTraderSteps.class, BeforeAfterSteps.class, AndSteps.class, CalendarSteps.class,
+PendingSteps.class, PriorityMatchingSteps.class, SandpitSteps.class })
+public class InheritingAnnotatedEmbedderUsingSteps extends ParentAnnotatedEmbedderUsingNeedle {
+
+&amp;lt; at &amp;gt;Test
+public void run() {
+injectedEmbedder().runStoriesAsPaths(storyPaths());
+}
+
+protected List&amp;lt;String&amp;gt; storyPaths() {
+return new StoryFinder().findPaths(codeLocationFromPath("../trader/src/main/java"), "**/*.story", "");
+}
+
+}
diff --git a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/NeedleTraderSteps.java b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/NeedleTraderSteps.java
new file mode 100644
index 0000000..77be1d9
--- /dev/null
+++ b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/NeedleTraderSteps.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,25 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.examples.trader.needle;
+
+import javax.inject.Inject;
+
+import org.jbehave.examples.trader.service.TradingService;
+import org.jbehave.examples.trader.steps.TraderSteps;
+
+/**
+ * POJO annotated to allow Needle injection.
+ */
+public class NeedleTraderSteps extends TraderSteps {
+
+&amp;lt; at &amp;gt;Inject
+private TradingService injectedService;
+
+public NeedleTraderSteps() {
+
+}
+
+&amp;lt; at &amp;gt;Override
+public TradingService getService() {
+return this.injectedService;
+}
+
+}
diff --git a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/ParentAnnotatedEmbedderUsingNeedle.java b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/ParentAnnotatedEmbedderUsingNeedle.java
new file mode 100644
index 0000000..1cd0452
--- /dev/null
+++ b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/ParentAnnotatedEmbedderUsingNeedle.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.examples.trader.needle;
+
+import org.jbehave.core.InjectableEmbedder;
+import org.jbehave.core.annotations.Configure;
+import org.jbehave.core.annotations.UsingEmbedder;
+import org.jbehave.core.annotations.needle.UsingNeedle;
+import org.jbehave.core.embedder.Embedder;
+import org.jbehave.core.junit.needle.NeedleAnnotatedEmbedderRunner;
+import org.junit.runner.RunWith;
+
+&amp;lt; at &amp;gt;RunWith(NeedleAnnotatedEmbedderRunner.class)
+&amp;lt; at &amp;gt;Configure()
+&amp;lt; at &amp;gt;UsingEmbedder(embedder = Embedder.class, generateViewAfterStories = true, ignoreFailureInStories = true, ignoreFailureInView = true)
+&amp;lt; at &amp;gt;UsingNeedle(provider = TraderServiceInjectionProvider.class)
+public abstract class ParentAnnotatedEmbedderUsingNeedle extends InjectableEmbedder {
+
+}
diff --git a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderServiceInjectionProvider.java b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderServiceInjectionProvider.java
new file mode 100644
index 0000000..bd9d78e
--- /dev/null
+++ b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderServiceInjectionProvider.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.examples.trader.needle;
+
+import org.jbehave.core.annotations.needle.DefaultInstanceInjectionProvider;
+import org.jbehave.examples.trader.service.TradingService;
+
+/**
+ * Injection provider holding the service.
+ * 
+ * &amp;lt; at &amp;gt;author Simon Zambrovski
+ */
+public final class TraderServiceInjectionProvider extends DefaultInstanceInjectionProvider&amp;lt;TradingService&amp;gt; {
+
+public TraderServiceInjectionProvider() {
+super(new TradingService());
+}
+}
diff --git a/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderStoriesUsingNeedle.java b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderStoriesUsingNeedle.java
new file mode 100644
index 0000000..deed234
--- /dev/null
+++ b/examples/trader-needle/src/main/java/org/jbehave/examples/trader/needle/TraderStoriesUsingNeedle.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,46 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.examples.trader.needle;
+
+import static org.jbehave.core.io.CodeLocations.codeLocationFromPath;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.jbehave.core.io.StoryFinder;
+import org.jbehave.core.steps.InjectableStepsFactory;
+import org.jbehave.core.steps.needle.NeedleStepsFactory;
+import org.jbehave.examples.trader.TraderStories;
+import org.jbehave.examples.trader.steps.AndSteps;
+import org.jbehave.examples.trader.steps.BeforeAfterSteps;
+import org.jbehave.examples.trader.steps.CalendarSteps;
+import org.jbehave.examples.trader.steps.PendingSteps;
+import org.jbehave.examples.trader.steps.PriorityMatchingSteps;
+import org.jbehave.examples.trader.steps.SandpitSteps;
+import org.jbehave.examples.trader.steps.SearchSteps;
+
+import de.akquinet.jbosscc.needle.injection.InjectionProvider;
+
+/**
+ * Run trader stories using NeedleStepsFactory. The textual trader stories are exactly the same ones found in the
+ * jbehave-trader-example. Here we are only concerned with using the container to compose the steps instances.
+ */
+public class TraderStoriesUsingNeedle extends TraderStories {
+
+&amp;lt; at &amp;gt;Override
+public InjectableStepsFactory stepsFactory() {
+final Class&amp;lt;?&amp;gt;[] steps = new Class&amp;lt;?&amp;gt;[] { NeedleTraderSteps.class, BeforeAfterSteps.class, AndSteps.class,
+CalendarSteps.class, PendingSteps.class, PriorityMatchingSteps.class, SandpitSteps.class,
+SearchSteps.class };
+
+final Set&amp;lt;InjectionProvider&amp;lt;?&amp;gt;&amp;gt; providers = new HashSet&amp;lt;InjectionProvider&amp;lt;?&amp;gt;&amp;gt;();
+providers.add(new TraderServiceInjectionProvider());
+
+return new NeedleStepsFactory(configuration(), providers, steps);
+}
+
+&amp;lt; at &amp;gt;Override
+protected List&amp;lt;String&amp;gt; storyPaths() {
+return new StoryFinder().findPaths(codeLocationFromPath("../trader/src/main/java"), "**/*.story", "");
+}
+
+}
diff --git a/examples/trader-needle/src/main/resources/needle.properties b/examples/trader-needle/src/main/resources/needle.properties
new file mode 100644
index 0000000..db45157
--- /dev/null
+++ b/examples/trader-needle/src/main/resources/needle.properties
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+mock.provider = de.akquinet.jbosscc.needle.mock.MockitoProvider
\ No newline at end of file
diff --git a/jbehave-needle/src/main/java/org/jbehave/core/annotations/needle/DefaultInstanceInjectionProvider.java b/jbehave-needle/src/main/java/org/jbehave/core/annotations/needle/DefaultInstanceInjectionProvider.java
new file mode 100644
index 0000000..583f941
--- /dev/null
+++ b/jbehave-needle/src/main/java/org/jbehave/core/annotations/needle/DefaultInstanceInjectionProvider.java
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -0,0 +1,63 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
+package org.jbehave.core.annotations.needle;
+
+import de.akquinet.jbosscc.needle.injection.InjectionProvider;
+import de.akquinet.jbosscc.needle.injection.InjectionTargetInformation;
+
+/**
+ * InjectionProvider that provides a singleton instance of type T whenever injection is required
+ * 
+ * &amp;lt; at &amp;gt;author Jan Galinski, Holisticon AG (jan.galinski-IJu/0kNRF9qOJsaolrKA/Q&amp;lt; at &amp;gt;public.gmane.org)
+ * 
+ * &amp;lt; at &amp;gt;param &amp;lt;T&amp;gt;
+ *            target type
+ */
+public class DefaultInstanceInjectionProvider&amp;lt;T&amp;gt; implements InjectionProvider&amp;lt;T&amp;gt; {
+
+/**
+ * Factory method.
+ * 
+ * &amp;lt; at &amp;gt;param instance
+ *            returns a provider for given instance.
+ * &amp;lt; at &amp;gt;return injection provider.
+ */
+public static &amp;lt;T&amp;gt; DefaultInstanceInjectionProvider&amp;lt;T&amp;gt; providerFor(final T instance) {
+return new DefaultInstanceInjectionProvider&amp;lt;T&amp;gt;(instance);
+}
+
+/**
+ * always return this instance
+ */
+private final T instance;
+
+/**
+ * Constructs an injection provider responsible for returning the same instance.
+ * 
+ * &amp;lt; at &amp;gt;param instance
+ *            instance to return.
+ */
+public DefaultInstanceInjectionProvider(final T instance) {
+this.instance = instance;
+}
+
+/**
+ * {&amp;lt; at &amp;gt;inheritDoc}
+ */
+public boolean verify(final InjectionTargetInformation injectionTargetInformation) {
+return injectionTargetInformation.getType().isAssignableFrom(instance.getClass());
+}
+
+/**
+ * {&amp;lt; at &amp;gt;inheritDoc}
+ */
+public T getInjectedObject(final Class&amp;lt;?&amp;gt; injectionPointType) {
+return instance;
+}
+
+/**
+ * {&amp;lt; at &amp;gt;inheritDoc}
+ */
+public Object getKey(final InjectionTargetInformation injectionTargetInformation) {
+return injectionTargetInformation.getType();
+}
+
+}



&lt;/pre&gt;</description>
    <dc:creator>zambrovski</dc:creator>
    <dc:date>2013-06-02T09:32:37</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.comp.java.jbehave.scm">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.comp.java.jbehave.scm</link>
  </textinput>
</rdf:RDF>
