You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2014/11/18 11:37:05 UTC

[2/2] isis git commit: ISIS-953: enhancements to FixtureScript.ExecutionContext

ISIS-953: enhancements to FixtureScript.ExecutionContext

Also:
- refactoring the todoapp and simpleapp to use FixtureScripts, lookup(...), and using composite fixtures.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/75735601
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/75735601
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/75735601

Branch: refs/heads/master
Commit: 75735601cd62234d9b5e0c531de5622ab07be2be
Parents: 0d9b74a
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Tue Nov 18 11:31:10 2014 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Tue Nov 18 11:31:10 2014 +0100

----------------------------------------------------------------------
 .../applib/fixturescripts/FixtureScript.java    |  56 ++++++
 .../fixturescripts/ExecutionContextTest.java    | 174 +++++++++++++++++++
 .../ExecutionContextTest_roundUp.java           |  39 -----
 .../src/main/java/dom/simple/SimpleObject.java  |   1 +
 .../fixture/simple/SimpleObjectsFixture.java    |  56 ------
 .../simple/SimpleObjectsFixturesService.java    |   4 +-
 .../simple/objects/SimpleObjectAbstract.java    |  36 ++++
 .../simple/objects/SimpleObjectForBar.java      |  31 ++++
 .../simple/objects/SimpleObjectForBaz.java      |  31 ++++
 .../simple/objects/SimpleObjectForFoo.java      |  31 ++++
 .../simple/scenario/SimpleObjectsFixture.java   |  45 +++++
 .../integration/glue/CatalogOfFixturesGlue.java |   2 +-
 .../tests/smoke/SimpleObjectTest.java           |  82 +++++++++
 .../tests/smoke/SimpleObjectsTest.java          | 148 ++++++++++++++++
 .../SimpleObjectsTest_listAll_and_create.java   |  66 -------
 .../src/main/webapp/WEB-INF/isis.properties     |   2 +-
 .../fixture/todo/ToDoItemsFixturesService.java  |  15 +-
 .../integtests/ToDoItemsIntegTestFixture.java   |   4 +-
 .../complete/ToDoItemCompleteAbstract.java      |  70 ++++++++
 .../complete/ToDoItemCompleteForBuyStamps.java  |  35 ++++
 .../ToDoItemCompleteForWriteBlogPost.java       |  36 ++++
 .../todo/items/create/ToDoItemAbstract.java     |  69 ++++++++
 .../todo/items/create/ToDoItemForBuyBread.java  |  37 ++++
 .../todo/items/create/ToDoItemForBuyMilk.java   |  37 ++++
 .../todo/items/create/ToDoItemForBuyStamps.java |  39 +++++
 .../todo/items/create/ToDoItemForMowLawn.java   |  37 ++++
 .../create/ToDoItemForOrganizeBrownBag.java     |  37 ++++
 .../items/create/ToDoItemForPickUpLaundry.java  |  37 ++++
 .../items/create/ToDoItemForSharpenKnives.java  |  37 ++++
 .../create/ToDoItemForStageIsisRelease.java     |  37 ++++
 .../ToDoItemForSubmitConferenceSession.java     |  37 ++++
 .../items/create/ToDoItemForVacuumHouse.java    |  37 ++++
 .../items/create/ToDoItemForWriteBlogPost.java  |  39 +++++
 .../items/create/ToDoItemForWriteToPenPal.java  |  37 ++++
 .../todo/items/delete/ToDoItemsDelete.java      |  53 ++++++
 .../todo/scenarios/DeleteToDoItemsFor.java      |  36 ----
 .../todo/scenarios/DeleteToDoItemsForSven.java  |  30 ----
 ...teToDoItemsAndCompleteSeveralForCurrent.java |  30 ----
 .../todo/scenarios/RecreateToDoItemsFor.java    |  36 ----
 .../scenarios/RecreateToDoItemsForDick.java     |  29 ----
 .../todo/scenarios/RecreateToDoItemsForJoe.java |  29 ----
 .../scenarios/RecreateToDoItemsForSven.java     |  29 ----
 .../todo/scenarios/ToDoItemsRecreate.java       |  81 +++++++++
 .../ToDoItemsRecreateAndCompleteSeveral.java    |  60 +++++++
 ...oItemsRecreateAndCompleteSeveralForDick.java |  28 +++
 ...DoItemsRecreateAndCompleteSeveralForJoe.java |  28 +++
 .../scenarios/ToDoItemsRecreateForSven.java     |  29 ++++
 .../fixture/todo/simple/ToDoItemsDelete.java    |  53 ------
 .../fixture/todo/simple/ToDoItemsRecreate.java  |  95 ----------
 .../ToDoItemsRecreateAndCompleteSeveral.java    |  72 --------
 .../src/main/java/fixture/todo/simple/Util.java |  36 ----
 .../src/main/java/fixture/todo/util/Util.java   |  32 ++++
 .../tests/ToDoItemContributionsIntegTest.java   |   5 +-
 .../integration/tests/ToDoItemIntegTest.java    |   3 +-
 .../src/main/webapp/WEB-INF/isis.properties     |   2 +-
 55 files changed, 1628 insertions(+), 649 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
index 97832a3..4c0b22a 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixturescripts/FixtureScript.java
@@ -18,12 +18,17 @@
  */
 package org.apache.isis.applib.fixturescripts;
 
+import java.io.IOException;
 import java.io.PrintStream;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
+import com.google.common.io.CharSource;
 import org.apache.isis.applib.AbstractViewModel;
 import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.annotation.Hidden;
@@ -253,20 +258,69 @@ public abstract class FixtureScript
             }
         };
 
+        private static Pattern keyEqualsValuePattern = Pattern.compile("([^=]*)=(.*)");
 
         private final String parameters;
         private final FixtureScripts fixtureScripts;
         private final FixtureResultList fixtureResultList;
+        private final Map<String, String> parameterMap;
+        ;
 
         public ExecutionContext(final String parameters, final FixtureScripts fixtureScripts) {
             this.fixtureScripts = fixtureScripts;
             fixtureResultList = new FixtureResultList(fixtureScripts, this);
             this.parameters = parameters;
+            this.parameterMap = asKeyValueMap(parameters);
+        }
+
+        public static Map<String, String> asKeyValueMap(String parameters) {
+            Map<String,String> keyValues = Maps.newLinkedHashMap();
+            if(parameters != null) {
+                try {
+                    final ImmutableList<String> lines = CharSource.wrap(parameters).readLines();
+                    for (String line : lines) {
+                        if (line == null) {
+                            continue;
+                        }
+                        final Matcher matcher = keyEqualsValuePattern.matcher(line);
+                        if (matcher.matches()) {
+                            keyValues.put(matcher.group(1).trim(), matcher.group(2).trim());
+                        }
+                    }
+                } catch (IOException e) {
+                    // ignore, shouldn't happen
+                }
+            }
+            return keyValues;
         }
 
         public String getParameters() {
             return parameters;
         }
+
+        public String getParameter(String parameterName) {
+            return getParameterMap().get(parameterName);
+        }
+
+        public Map<String,String> getParameterMap() {
+            return Collections.unmodifiableMap(parameterMap);
+        }
+
+        public void setParameterIfNotPresent(String parameterName, String parameterValue) {
+            if(parameterName == null) {
+                throw new IllegalArgumentException("parameterName required");
+            }
+            if(parameterValue == null) {
+                // ignore
+                return;
+            }
+            if(parameterMap.containsKey(parameterName)) {
+                // ignore; the supplies parameters take precedence
+                return;
+            }
+            parameterMap.put(parameterName, parameterValue);
+        }
+
         public List<FixtureResult> getResults() {
             return fixtureResultList.getResults();
         }
@@ -285,6 +339,7 @@ public abstract class FixtureScript
             return fixtureResultList.lookup(key, cls);
         }
 
+
         static enum As { EXEC, SKIP }
 
         /**
@@ -396,6 +451,7 @@ public abstract class FixtureScript
         return executionContext.lookup(key, cls);
     }
 
+
     /**
      * Optional hook to validate parameters.
      */

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/core/applib/src/test/java/org/apache/isis/applib/fixturescripts/ExecutionContextTest.java
----------------------------------------------------------------------
diff --git a/core/applib/src/test/java/org/apache/isis/applib/fixturescripts/ExecutionContextTest.java b/core/applib/src/test/java/org/apache/isis/applib/fixturescripts/ExecutionContextTest.java
new file mode 100644
index 0000000..fdbf192
--- /dev/null
+++ b/core/applib/src/test/java/org/apache/isis/applib/fixturescripts/ExecutionContextTest.java
@@ -0,0 +1,174 @@
+package org.apache.isis.applib.fixturescripts;
+
+import java.util.Map;
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+public class ExecutionContextTest {
+
+    public static class AsKeyValueMap extends ExecutionContextTest {
+
+        @Test
+        public void happyCase() throws Exception {
+            final Map<String, String> map = FixtureScript.ExecutionContext.asKeyValueMap("foo=bar\nbop=baz");
+            assertThat(map.size(), is(2));
+
+            assertThat(map.get("foo"), is("bar"));
+            assertThat(map.get("bop"), is("baz"));
+        }
+
+        @Test
+        public void givenNull() throws Exception {
+            final Map<String, String> map = FixtureScript.ExecutionContext.asKeyValueMap(null);
+            assertThat(map.size(), is(0));
+        }
+
+        @Test
+        public void givenEmpty() throws Exception {
+            final Map<String, String> map = FixtureScript.ExecutionContext.asKeyValueMap("");
+            assertThat(map.size(), is(0));
+        }
+
+        @Test
+        public void trim() throws Exception {
+
+            final Map<String, String> map = FixtureScript.ExecutionContext.asKeyValueMap(" foo=bar\nbop=baz \n bip = bap ");
+            assertThat(map.size(), is(3));
+
+            assertThat(map.get("foo"), is("bar"));
+            assertThat(map.get("bop"), is("baz"));
+            assertThat(map.get("bip"), is("bap"));
+        }
+
+        @Test
+        public void malformed() throws Exception {
+            final Map<String, String> map = FixtureScript.ExecutionContext.asKeyValueMap("abcde");
+            assertThat(map.size(), is(0));
+        }
+
+        @Test
+        public void partiallyMalformed() throws Exception {
+            final Map<String, String> map = FixtureScript.ExecutionContext.asKeyValueMap("foo=bar\nabcde\nbop=baz");
+            assertThat(map.size(), is(2));
+
+            assertThat(map.get("foo"), is("bar"));
+            assertThat(map.get("bop"), is("baz"));
+        }
+    }
+
+
+    public static class GetParameter extends ExecutionContextTest {
+
+        @Test
+        public void happyCase() throws Exception {
+            final FixtureScript.ExecutionContext executionContext = new FixtureScript.ExecutionContext("foo=bar\nbop=baz", null);
+
+            final Map<String, String> map = executionContext.getParameterMap();
+            assertThat(map.size(), is(2));
+
+            assertThat(map.get("foo"), is("bar"));
+            assertThat(map.get("bop"), is("baz"));
+
+            assertThat(executionContext.getParameter("foo"), is("bar"));
+            assertThat(executionContext.getParameter("bop"), is("baz"));
+
+        }
+
+        @Test
+        public void givenNull() throws Exception {
+            final FixtureScript.ExecutionContext executionContext = new FixtureScript.ExecutionContext(null, null);
+            final Map<String, String> map = executionContext.getParameterMap();
+            assertThat(map.size(), is(0));
+
+            assertThat(executionContext.getParameter("foo"), is(nullValue()));
+        }
+
+        @Test
+        public void givenEmpty() throws Exception {
+            final FixtureScript.ExecutionContext executionContext = new FixtureScript.ExecutionContext("", null);
+            final Map<String, String> map = executionContext.getParameterMap();
+            assertThat(map.size(), is(0));
+
+            assertThat(executionContext.getParameter("foo"), is(nullValue()));
+        }
+
+        @Test
+        public void malformed() throws Exception {
+            final FixtureScript.ExecutionContext executionContext = new FixtureScript.ExecutionContext("abcde", null);
+            final Map<String, String> map = executionContext.getParameterMap();
+            assertThat(map.size(), is(0));
+
+            assertThat(executionContext.getParameter("foo"), is(nullValue()));
+        }
+
+        @Test
+        public void partiallyMalformed() throws Exception {
+            final FixtureScript.ExecutionContext executionContext = new FixtureScript.ExecutionContext("foo=bar\nabcde\nbop=baz", null);
+
+            final Map<String, String> map = executionContext.getParameterMap();
+            assertThat(map.size(), is(2));
+
+            assertThat(map.get("foo"), is("bar"));
+            assertThat(map.get("bop"), is("baz"));
+
+            assertThat(executionContext.getParameter("foo"), is("bar"));
+            assertThat(executionContext.getParameter("bop"), is("baz"));
+        }
+
+        @Test
+        public void trim() throws Exception {
+            final FixtureScript.ExecutionContext executionContext = new FixtureScript.ExecutionContext(" foo=bar\nbop=baz \n bip = bap ", null);
+
+            final Map<String, String> map = executionContext.getParameterMap();
+            assertThat(map.size(), is(3));
+
+            assertThat(map.get("foo"), is("bar"));
+            assertThat(map.get("bop"), is("baz"));
+            assertThat(map.get("bip"), is("bap"));
+
+            assertThat(executionContext.getParameter("foo"), is("bar"));
+            assertThat(executionContext.getParameter("bop"), is("baz"));
+            assertThat(executionContext.getParameter("bip"), is("bap"));
+        }
+
+    }
+    public static class SetParameterIfNotPresent extends ExecutionContextTest {
+
+        @Test
+        public void whenNotPresent() throws Exception {
+            final FixtureScript.ExecutionContext executionContext = new FixtureScript.ExecutionContext(null, null);
+            executionContext.setParameterIfNotPresent("foo", "bar");
+
+            assertThat(executionContext.getParameter("foo"), is("bar"));
+        }
+
+        @Test
+        public void whenPresent() throws Exception {
+            final FixtureScript.ExecutionContext executionContext = new FixtureScript.ExecutionContext("foo=bop\n", null);
+            executionContext.setParameterIfNotPresent("foo", "bar");
+
+            assertThat(executionContext.getParameter("foo"), is("bop"));
+        }
+
+    }
+
+    public static class RoundUp extends ExecutionContextTest {
+
+        @Test
+        public void happyCase() throws Exception {
+            Assert.assertThat(FixtureScript.ExecutionContext.roundup(5, 20), Matchers.is(20));
+            Assert.assertThat(FixtureScript.ExecutionContext.roundup(19, 20), Matchers.is(20));
+            Assert.assertThat(FixtureScript.ExecutionContext.roundup(20, 20), Matchers.is(40));
+            Assert.assertThat(FixtureScript.ExecutionContext.roundup(21, 20), Matchers.is(40));
+            Assert.assertThat(FixtureScript.ExecutionContext.roundup(39, 20), Matchers.is(40));
+            Assert.assertThat(FixtureScript.ExecutionContext.roundup(40, 20), Matchers.is(60));
+        }
+
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/core/applib/src/test/java/org/apache/isis/applib/fixturescripts/ExecutionContextTest_roundUp.java
----------------------------------------------------------------------
diff --git a/core/applib/src/test/java/org/apache/isis/applib/fixturescripts/ExecutionContextTest_roundUp.java b/core/applib/src/test/java/org/apache/isis/applib/fixturescripts/ExecutionContextTest_roundUp.java
deleted file mode 100644
index 82ac787..0000000
--- a/core/applib/src/test/java/org/apache/isis/applib/fixturescripts/ExecutionContextTest_roundUp.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.applib.fixturescripts;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import static org.hamcrest.Matchers.is;
-
-public class ExecutionContextTest_roundUp {
-
-    @Test
-    public void happyCase() throws Exception {
-        Assert.assertThat(FixtureScript.ExecutionContext.roundup(5, 20), is(20));
-        Assert.assertThat(FixtureScript.ExecutionContext.roundup(19, 20), is(20));
-        Assert.assertThat(FixtureScript.ExecutionContext.roundup(20, 20), is(40));
-        Assert.assertThat(FixtureScript.ExecutionContext.roundup(21, 20), is(40));
-        Assert.assertThat(FixtureScript.ExecutionContext.roundup(39, 20), is(40));
-        Assert.assertThat(FixtureScript.ExecutionContext.roundup(40, 20), is(60));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObject.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObject.java b/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObject.java
index a5f8e43..74cef09 100644
--- a/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObject.java
+++ b/example/application/simpleapp/dom/src/main/java/dom/simple/SimpleObject.java
@@ -34,6 +34,7 @@ import org.apache.isis.applib.util.ObjectContracts;
 @javax.jdo.annotations.Version(
         strategy=VersionStrategy.VERSION_NUMBER, 
         column="version")
+@javax.jdo.annotations.Unique(name="SimpleObject_name_UNQ", members = {"name"})
 @ObjectType("SIMPLE")
 @Bookmarkable
 public class SimpleObject implements Comparable<SimpleObject> {

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixture.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixture.java b/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixture.java
deleted file mode 100644
index 7be750b..0000000
--- a/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixture.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package fixture.simple;
-
-import dom.simple.SimpleObject;
-import dom.simple.SimpleObjects;
-
-import org.apache.isis.applib.fixturescripts.FixtureScript;
-
-public class SimpleObjectsFixture extends FixtureScript {
-
-    public SimpleObjectsFixture() {
-        withDiscoverability(Discoverability.DISCOVERABLE);
-    }
-
-    @Override
-    protected void execute(ExecutionContext executionContext) {
-
-        // prereqs
-        executeChild(new SimpleObjectsTearDownFixture(), executionContext);
-
-        // create
-        create("Foo", executionContext);
-        create("Bar", executionContext);
-        create("Baz", executionContext);
-    }
-
-    // //////////////////////////////////////
-
-    private SimpleObject create(final String name, ExecutionContext executionContext) {
-        return executionContext.add(this, simpleObjects.create(name));
-    }
-
-    // //////////////////////////////////////
-
-    @javax.inject.Inject
-    private SimpleObjects simpleObjects;
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java b/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
index fcb6c49..7868d3c 100644
--- a/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
+++ b/example/application/simpleapp/fixture/src/main/java/fixture/simple/SimpleObjectsFixturesService.java
@@ -18,6 +18,8 @@
  */
 package fixture.simple;
 
+import fixture.simple.scenario.SimpleObjectsFixture;
+
 import java.util.List;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.MemberOrder;
@@ -39,7 +41,7 @@ public class SimpleObjectsFixturesService extends FixtureScripts {
         super("fixture.simple");
     }
 
-    //@Override // compatibility with core 1.5.0
+    @Override
     public FixtureScript default0RunFixtureScript() {
         return findFixtureScriptFor(SimpleFixtureScript.class);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java b/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java
new file mode 100644
index 0000000..d72578e
--- /dev/null
+++ b/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectAbstract.java
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package fixture.simple.objects;
+
+import dom.simple.SimpleObject;
+import dom.simple.SimpleObjects;
+
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+
+public abstract class SimpleObjectAbstract extends FixtureScript {
+
+    protected SimpleObject create(final String name, ExecutionContext executionContext) {
+        return executionContext.add(this, simpleObjects.create(name));
+    }
+
+    @javax.inject.Inject
+    private SimpleObjects simpleObjects;
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java b/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java
new file mode 100644
index 0000000..a59aea4
--- /dev/null
+++ b/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBar.java
@@ -0,0 +1,31 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package fixture.simple.objects;
+
+public class SimpleObjectForBar extends SimpleObjectAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        create("Bar", executionContext);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java b/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java
new file mode 100644
index 0000000..b71baeb
--- /dev/null
+++ b/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForBaz.java
@@ -0,0 +1,31 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package fixture.simple.objects;
+
+public class SimpleObjectForBaz extends SimpleObjectAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        create("Baz", executionContext);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java b/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java
new file mode 100644
index 0000000..fa3d488
--- /dev/null
+++ b/example/application/simpleapp/fixture/src/main/java/fixture/simple/objects/SimpleObjectForFoo.java
@@ -0,0 +1,31 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package fixture.simple.objects;
+
+public class SimpleObjectForFoo extends SimpleObjectAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        create("Foo", executionContext);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/simpleapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java b/example/application/simpleapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java
new file mode 100644
index 0000000..12582e6
--- /dev/null
+++ b/example/application/simpleapp/fixture/src/main/java/fixture/simple/scenario/SimpleObjectsFixture.java
@@ -0,0 +1,45 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package fixture.simple.scenario;
+
+import fixture.simple.SimpleObjectsTearDownFixture;
+import fixture.simple.objects.SimpleObjectForBar;
+import fixture.simple.objects.SimpleObjectForBaz;
+import fixture.simple.objects.SimpleObjectForFoo;
+
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+
+public class SimpleObjectsFixture extends FixtureScript {
+
+    public SimpleObjectsFixture() {
+        withDiscoverability(Discoverability.DISCOVERABLE);
+    }
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        executeChild(new SimpleObjectsTearDownFixture(), executionContext);
+
+        executeChild(new SimpleObjectForFoo(), executionContext);
+        executeChild(new SimpleObjectForBar(), executionContext);
+        executeChild(new SimpleObjectForBaz(), executionContext);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/simpleapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java b/example/application/simpleapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java
index b499e85..508a3a0 100644
--- a/example/application/simpleapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java
+++ b/example/application/simpleapp/integtests/src/test/java/integration/glue/CatalogOfFixturesGlue.java
@@ -18,7 +18,7 @@ package integration.glue;
 
 import cucumber.api.java.Before;
 import dom.simple.SimpleObject;
-import fixture.simple.SimpleObjectsFixture;
+import fixture.simple.scenario.SimpleObjectsFixture;
 
 import org.apache.isis.core.specsupport.scenarios.InMemoryDB;
 import org.apache.isis.core.specsupport.specs.CukeGlueAbstract;

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/simpleapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java b/example/application/simpleapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java
new file mode 100644
index 0000000..13e24f9
--- /dev/null
+++ b/example/application/simpleapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectTest.java
@@ -0,0 +1,82 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package integration.tests.smoke;
+
+import dom.simple.SimpleObject;
+import dom.simple.SimpleObjects;
+import fixture.simple.scenario.SimpleObjectsFixture;
+import fixture.simple.SimpleObjectsTearDownFixture;
+import integration.tests.SimpleAppIntegTest;
+
+import javax.inject.Inject;
+import org.junit.Test;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.fixturescripts.FixtureScripts;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+
+public class SimpleObjectTest extends SimpleAppIntegTest {
+
+    @Inject
+    FixtureScripts fixtureScripts;
+    @Inject
+    SimpleObjects simpleObjects;
+
+    FixtureScript fixtureScript;
+
+    public static class Name extends SimpleObjectTest {
+
+        @Test
+        public void exists() throws Exception {
+
+            // given
+            fixtureScript = new SimpleObjectsFixture();
+            fixtureScripts.runFixtureScript(fixtureScript, null);
+
+            final SimpleObject simpleObjectPojo =
+                    fixtureScript.lookup("simple-objects-fixture/simple-object-for-foo/item-1", SimpleObject.class);
+
+            // when
+            assertThat(simpleObjectPojo, is(not(nullValue())));
+            final SimpleObject simpleObjectWrapped = wrap(simpleObjectPojo);
+
+            // then
+            assertThat(simpleObjectWrapped.getName(), is("Foo"));
+        }
+
+        @Test
+        public void doesNotExist() throws Exception {
+
+            // given
+            fixtureScript = new SimpleObjectsTearDownFixture();
+            fixtureScripts.runFixtureScript(fixtureScript, null);
+
+            // when
+            SimpleObject simpleObjectPojo = fixtureScript.lookup("non-existent", SimpleObject.class);
+
+            // then
+            assertThat(simpleObjectPojo, is(nullValue()));
+
+        }
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/simpleapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java b/example/application/simpleapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java
new file mode 100644
index 0000000..3963c8c
--- /dev/null
+++ b/example/application/simpleapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest.java
@@ -0,0 +1,148 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package integration.tests.smoke;
+
+import dom.simple.SimpleObject;
+import dom.simple.SimpleObjects;
+import fixture.simple.scenario.SimpleObjectsFixture;
+import fixture.simple.SimpleObjectsTearDownFixture;
+import integration.tests.SimpleAppIntegTest;
+
+import java.sql.SQLIntegrityConstraintViolationException;
+import java.util.List;
+import javax.inject.Inject;
+import com.google.common.base.Throwables;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.fixturescripts.FixtureScripts;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+public class SimpleObjectsTest extends SimpleAppIntegTest {
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Inject
+    FixtureScripts fixtureScripts;
+    @Inject
+    SimpleObjects simpleObjects;
+
+    FixtureScript fixtureScript;
+
+    public static class ListAll extends SimpleObjectsTest {
+
+        @Test
+        public void happyCase() throws Exception {
+
+            // given
+            fixtureScript = new SimpleObjectsFixture();
+            fixtureScripts.runFixtureScript(fixtureScript, null);
+            nextTransaction();
+
+            // when
+            final List<SimpleObject> all = wrap(simpleObjects).listAll();
+
+            // then
+            assertThat(all.size(), is(3));
+
+            SimpleObject simpleObject = wrap(all.get(0));
+            assertThat(simpleObject.getName(), is("Foo"));
+        }
+
+        @Test
+        public void whenNone() throws Exception {
+
+            // given
+            fixtureScript = new SimpleObjectsTearDownFixture();
+            fixtureScripts.runFixtureScript(fixtureScript, null);
+            nextTransaction();
+
+            // when
+            final List<SimpleObject> all = wrap(simpleObjects).listAll();
+
+            // then
+            assertThat(all.size(), is(0));
+        }
+    }
+
+    public static class Create extends SimpleObjectsTest {
+
+        @Test
+        public void happyCase() throws Exception {
+
+            // given
+            fixtureScript = new SimpleObjectsTearDownFixture();
+            fixtureScripts.runFixtureScript(fixtureScript, null);
+            nextTransaction();
+
+            // when
+            wrap(simpleObjects).create("Faz");
+
+            // then
+            final List<SimpleObject> all = wrap(simpleObjects).listAll();
+            assertThat(all.size(), is(1));
+        }
+
+        @Test
+        public void whenAlreadyExists() throws Exception {
+
+            // given
+            fixtureScript = new SimpleObjectsTearDownFixture();
+            fixtureScripts.runFixtureScript(fixtureScript, null);
+            nextTransaction();
+            wrap(simpleObjects).create("Faz");
+            nextTransaction();
+
+            // then
+            expectedException.expectCause(causalChainContains(SQLIntegrityConstraintViolationException.class));
+
+            // when
+            wrap(simpleObjects).create("Faz");
+            nextTransaction();
+        }
+
+        private static Matcher<? extends Throwable> causalChainContains(final Class<?> cls) {
+            return new TypeSafeMatcher<Throwable>() {
+                @Override
+                protected boolean matchesSafely(Throwable item) {
+                    final List<Throwable> causalChain = Throwables.getCausalChain(item);
+                    for (Throwable throwable : causalChain) {
+                        if(cls.isAssignableFrom(throwable.getClass())){
+                            return true;
+                        }
+                    }
+                    return false;
+                }
+
+                @Override
+                public void describeTo(Description description) {
+                    description.appendText("exception with causal chain containing " + cls.getSimpleName());
+                }
+            };
+        }
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/simpleapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest_listAll_and_create.java
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest_listAll_and_create.java b/example/application/simpleapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest_listAll_and_create.java
deleted file mode 100644
index c2146e5..0000000
--- a/example/application/simpleapp/integtests/src/test/java/integration/tests/smoke/SimpleObjectsTest_listAll_and_create.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package integration.tests.smoke;
-
-import dom.simple.SimpleObject;
-import dom.simple.SimpleObjects;
-import fixture.simple.SimpleObjectsFixture;
-import integration.tests.SimpleAppIntegTest;
-
-import java.util.List;
-import javax.inject.Inject;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class SimpleObjectsTest_listAll_and_create extends SimpleAppIntegTest {
-
-    @Before
-    public void setUpData() throws Exception {
-        scenarioExecution().install(new SimpleObjectsFixture());
-    }
-
-    @Inject
-    private SimpleObjects simpleObjects;
-
-    @Test
-    public void listAll() throws Exception {
-
-        final List<SimpleObject> all = wrap(simpleObjects).listAll();
-        assertThat(all.size(), is(3));
-        
-        SimpleObject simpleObject = wrap(all.get(0));
-        assertThat(simpleObject.getName(), is("Foo"));
-    }
-    
-    @Test
-    public void create() throws Exception {
-
-        // when
-        wrap(simpleObjects).create("Faz");
-        nextTransaction();
-
-        // then
-        final List<SimpleObject> all = wrap(simpleObjects).listAll();
-        assertThat(all.size(), is(4));
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties
----------------------------------------------------------------------
diff --git a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties
index 87cce22..54bf51c 100644
--- a/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties
+++ b/example/application/simpleapp/webapp/src/main/webapp/WEB-INF/isis.properties
@@ -154,7 +154,7 @@ isis.services = \
 # in-memory object store, the fixtures are installed on every run.  For other
 # object stores, they are used only when the object store is first initialized.
 #
-isis.fixtures=fixture.simple.SimpleObjectsFixture
+isis.fixtures=fixture.simple.scenario.SimpleObjectsFixture
 
 
 #

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
index 137e12a..053cebe 100644
--- a/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/ToDoItemsFixturesService.java
@@ -18,7 +18,7 @@
  */
 package fixture.todo;
 
-import fixture.todo.scenarios.RecreateToDoItemsAndCompleteSeveralForCurrent;
+import fixture.todo.scenarios.ToDoItemsRecreateAndCompleteSeveral;
 
 import java.util.List;
 import org.apache.isis.applib.annotation.CssClassFa;
@@ -36,7 +36,7 @@ import org.apache.isis.applib.fixturescripts.FixtureScripts;
 /**
  * Enables fixtures to be installed from the application.
  */
-@Named("Prototyping") // has the effect of defining a "Prototyping" menu item
+@Named("Prototyping")
 @DomainService(menuOrder = "40.1")
 public class ToDoItemsFixturesService extends FixtureScripts {
 
@@ -46,13 +46,18 @@ public class ToDoItemsFixturesService extends FixtureScripts {
 
     @CssClassFa("fa fa-bolt")
     @Override
-    public List<FixtureResult> runFixtureScript(FixtureScript fixtureScript, @Named("Parameters") @DescribedAs("Script-specific parameters (if any).  The format depends on the script implementation (eg key=value, CSV, JSON, XML etc)") @MultiLine(numberOfLines = 10) @Optional String parameters) {
+    public List<FixtureResult> runFixtureScript(
+            final FixtureScript fixtureScript,
+            final @Named("Parameters") @DescribedAs("Script-specific parameters (key=value) ")
+            @MultiLine(numberOfLines = 10)
+            @Optional
+            String parameters) {
         return super.runFixtureScript(fixtureScript, parameters);
     }
 
     @Override
     public FixtureScript default0RunFixtureScript() {
-        return findFixtureScriptFor(RecreateToDoItemsAndCompleteSeveralForCurrent.class);
+        return findFixtureScriptFor(ToDoItemsRecreateAndCompleteSeveral.class);
     }
 
     /**
@@ -71,7 +76,7 @@ public class ToDoItemsFixturesService extends FixtureScripts {
     @CssClassFa("fa fa-list")
     @MemberOrder(sequence="20")
     public Object recreateToDoItemsReturnFirst() {
-        final List<FixtureResult> run = findFixtureScriptFor(RecreateToDoItemsAndCompleteSeveralForCurrent.class).run(null);
+        final List<FixtureResult> run = findFixtureScriptFor(ToDoItemsRecreateAndCompleteSeveral.class).run(null);
         return run.get(0).getObject();
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/integtests/ToDoItemsIntegTestFixture.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/integtests/ToDoItemsIntegTestFixture.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/integtests/ToDoItemsIntegTestFixture.java
index c076a6a..6953e3f 100644
--- a/example/application/todoapp/fixture/src/main/java/fixture/todo/integtests/ToDoItemsIntegTestFixture.java
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/integtests/ToDoItemsIntegTestFixture.java
@@ -19,7 +19,7 @@
 
 package fixture.todo.integtests;
 
-import fixture.todo.simple.ToDoItemsRecreateAndCompleteSeveral;
+import fixture.todo.scenarios.ToDoItemsRecreateAndCompleteSeveral;
 
 import org.apache.isis.applib.fixturescripts.FixtureScript;
 
@@ -34,7 +34,7 @@ public class ToDoItemsIntegTestFixture extends FixtureScript {
 
     @Override
     protected void execute(ExecutionContext executionContext) {
-        executeChild(new ToDoItemsRecreateAndCompleteSeveral(null), executionContext);
+        executeChild(new ToDoItemsRecreateAndCompleteSeveral(), executionContext);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/actions/complete/ToDoItemCompleteAbstract.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/actions/complete/ToDoItemCompleteAbstract.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/actions/complete/ToDoItemCompleteAbstract.java
new file mode 100644
index 0000000..1d6271c
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/actions/complete/ToDoItemCompleteAbstract.java
@@ -0,0 +1,70 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.actions.complete;
+
+import dom.todo.ToDoItem;
+
+import java.util.Collection;
+import com.google.common.base.Objects;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Collections2;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+
+public abstract class ToDoItemCompleteAbstract extends FixtureScript {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+        validateParameters(executionContext);
+
+
+    }
+
+    /**
+     * Subclasses should call from within {@link #execute(org.apache.isis.applib.fixturescripts.FixtureScript.ExecutionContext)}.
+     */
+    protected void validateParameters(ExecutionContext executionContext) {
+        final String ownedBy = executionContext.getParameter("ownedBy");
+        if(ownedBy == null) {
+            throw new IllegalArgumentException("'ownedBy' must be specified");
+        }
+    }
+
+    /**
+     * Looks up item from repository, and completes.
+     */
+    protected void complete(final String description, final ExecutionContext executionContext) {
+        String ownedBy = executionContext.getParameter("ownedBy");
+        final ToDoItem toDoItem = findToDoItem(description, ownedBy);
+        toDoItem.setComplete(true);
+        executionContext.add(this, toDoItem);
+    }
+
+
+    private ToDoItem findToDoItem(final String description, final String ownedBy) {
+        final Collection<ToDoItem> filtered = Collections2.filter(getContainer().allInstances(ToDoItem.class), new Predicate<ToDoItem>() {
+            @Override
+            public boolean apply(ToDoItem input) {
+                return Objects.equal(description, input.getDescription()) &&
+                       Objects.equal(ownedBy, input.getOwnedBy());
+            }
+        });
+        return filtered.isEmpty()? null: filtered.iterator().next();
+    }
+    //endregion
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/actions/complete/ToDoItemCompleteForBuyStamps.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/actions/complete/ToDoItemCompleteForBuyStamps.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/actions/complete/ToDoItemCompleteForBuyStamps.java
new file mode 100644
index 0000000..0d29846
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/actions/complete/ToDoItemCompleteForBuyStamps.java
@@ -0,0 +1,35 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.actions.complete;
+
+import fixture.todo.items.create.ToDoItemForBuyStamps;
+
+public class ToDoItemCompleteForBuyStamps extends ToDoItemCompleteAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        // prereqs
+        executeChild(new ToDoItemForBuyStamps(), executionContext);
+
+        // this fixture
+        complete(ToDoItemForBuyStamps.DESCRIPTION, executionContext);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/actions/complete/ToDoItemCompleteForWriteBlogPost.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/actions/complete/ToDoItemCompleteForWriteBlogPost.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/actions/complete/ToDoItemCompleteForWriteBlogPost.java
new file mode 100644
index 0000000..8db5d90
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/actions/complete/ToDoItemCompleteForWriteBlogPost.java
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.actions.complete;
+
+import fixture.todo.items.create.ToDoItemForWriteBlogPost;
+
+public class ToDoItemCompleteForWriteBlogPost extends ToDoItemCompleteAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        // prereqs
+        executeChild(new ToDoItemForWriteBlogPost(), executionContext);
+
+        // this fixture
+        complete(ToDoItemForWriteBlogPost.DESCRIPTION, executionContext);
+    }
+
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemAbstract.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemAbstract.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemAbstract.java
new file mode 100644
index 0000000..16bc2ea
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemAbstract.java
@@ -0,0 +1,69 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.create;
+
+import dom.todo.ToDoItem;
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+import dom.todo.ToDoItems;
+
+import java.math.BigDecimal;
+import org.joda.time.LocalDate;
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.services.clock.ClockService;
+
+public abstract class ToDoItemAbstract extends FixtureScript {
+
+    protected ToDoItem createToDoItem(
+            final String description,
+            final Category category, final Subcategory subcategory,
+            final LocalDate dueBy,
+            final BigDecimal cost,
+            final ExecutionContext executionContext) {
+
+        // validate parameters
+        final String ownedBy = executionContext.getParameter("ownedBy");
+        if(ownedBy == null) {
+            throw new IllegalArgumentException("'ownedBy' must be specified");
+        }
+
+        // execute
+        ToDoItem newToDo = toDoItems.newToDo(
+                description, category, subcategory, ownedBy, dueBy, cost);
+        return executionContext.add(this, newToDo);
+    }
+
+    protected LocalDate nowPlusDays(int days) {
+        return clockService.now().plusDays(days);
+    }
+
+    protected BigDecimal BD(String str) {
+        return new BigDecimal(str);
+    }
+
+    //region > injected services
+    @javax.inject.Inject
+    private ToDoItems toDoItems;
+
+    @javax.inject.Inject
+    protected ClockService clockService;
+    //endregion
+
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForBuyBread.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForBuyBread.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForBuyBread.java
new file mode 100644
index 0000000..0bcde45
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForBuyBread.java
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.create;
+
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+
+public class ToDoItemForBuyBread extends ToDoItemAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        createToDoItem(
+                "Buy bread",
+                Category.Domestic, Subcategory.Shopping,
+                nowPlusDays(0),
+                BD("1.75"),
+                executionContext);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForBuyMilk.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForBuyMilk.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForBuyMilk.java
new file mode 100644
index 0000000..da6d25e
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForBuyMilk.java
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.create;
+
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+
+public class ToDoItemForBuyMilk extends ToDoItemAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        createToDoItem(
+                "Buy milk",
+                Category.Domestic, Subcategory.Shopping,
+                nowPlusDays(0),
+                BD("0.75"),
+                executionContext);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForBuyStamps.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForBuyStamps.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForBuyStamps.java
new file mode 100644
index 0000000..4c6fb70
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForBuyStamps.java
@@ -0,0 +1,39 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.create;
+
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+
+public class ToDoItemForBuyStamps extends ToDoItemAbstract {
+
+    public static final String DESCRIPTION = "Buy stamps";
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        createToDoItem(
+                DESCRIPTION,
+                Category.Domestic, Subcategory.Shopping,
+                nowPlusDays(0),
+                BD("10.00"),
+                executionContext);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForMowLawn.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForMowLawn.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForMowLawn.java
new file mode 100644
index 0000000..daf4e2e
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForMowLawn.java
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.create;
+
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+
+public class ToDoItemForMowLawn extends ToDoItemAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        createToDoItem(
+                "Mow lawn",
+                Category.Domestic, Subcategory.Garden,
+                nowPlusDays(6),
+                null,
+                executionContext);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForOrganizeBrownBag.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForOrganizeBrownBag.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForOrganizeBrownBag.java
new file mode 100644
index 0000000..d4c01a7
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForOrganizeBrownBag.java
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.create;
+
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+
+public class ToDoItemForOrganizeBrownBag extends ToDoItemAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        createToDoItem(
+                "Organize brown bag",
+                Category.Professional, Subcategory.Consulting,
+                nowPlusDays(14),
+                null,
+                executionContext);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForPickUpLaundry.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForPickUpLaundry.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForPickUpLaundry.java
new file mode 100644
index 0000000..5d9a309
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForPickUpLaundry.java
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.create;
+
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+
+public class ToDoItemForPickUpLaundry extends ToDoItemAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        createToDoItem(
+                "Pick up laundry",
+                Category.Domestic, Subcategory.Chores,
+                nowPlusDays(6),
+                BD("7.50"),
+                executionContext);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForSharpenKnives.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForSharpenKnives.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForSharpenKnives.java
new file mode 100644
index 0000000..c850993
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForSharpenKnives.java
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.create;
+
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+
+public class ToDoItemForSharpenKnives extends ToDoItemAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        createToDoItem(
+                "Sharpen knives",
+                Category.Domestic, Subcategory.Chores,
+                nowPlusDays(14),
+                null,
+                executionContext);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForStageIsisRelease.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForStageIsisRelease.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForStageIsisRelease.java
new file mode 100644
index 0000000..d9544ab
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForStageIsisRelease.java
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.create;
+
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+
+public class ToDoItemForStageIsisRelease extends ToDoItemAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        createToDoItem(
+                "Stage Isis release",
+                Category.Professional, Subcategory.OpenSource,
+                null,
+                null,
+                executionContext);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForSubmitConferenceSession.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForSubmitConferenceSession.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForSubmitConferenceSession.java
new file mode 100644
index 0000000..86e7177
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForSubmitConferenceSession.java
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.create;
+
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+
+public class ToDoItemForSubmitConferenceSession extends ToDoItemAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        createToDoItem(
+                "Submit conference session",
+                Category.Professional, Subcategory.Education,
+                nowPlusDays(21),
+                null,
+                executionContext);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForVacuumHouse.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForVacuumHouse.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForVacuumHouse.java
new file mode 100644
index 0000000..64f4ab4
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForVacuumHouse.java
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.create;
+
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+
+public class ToDoItemForVacuumHouse extends ToDoItemAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        createToDoItem(
+                "Vacuum house",
+                Category.Domestic, Subcategory.Housework,
+                nowPlusDays(3),
+                null,
+                executionContext);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForWriteBlogPost.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForWriteBlogPost.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForWriteBlogPost.java
new file mode 100644
index 0000000..8d912ad
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForWriteBlogPost.java
@@ -0,0 +1,39 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.create;
+
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+
+public class ToDoItemForWriteBlogPost extends ToDoItemAbstract {
+
+    public static final String DESCRIPTION = "Write blog post";
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        createToDoItem(
+                DESCRIPTION,
+                Category.Professional, Subcategory.Marketing,
+                nowPlusDays(7),
+                null,
+                executionContext);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForWriteToPenPal.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForWriteToPenPal.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForWriteToPenPal.java
new file mode 100644
index 0000000..eb495a2
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/create/ToDoItemForWriteToPenPal.java
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.create;
+
+import dom.todo.ToDoItem.Category;
+import dom.todo.ToDoItem.Subcategory;
+
+public class ToDoItemForWriteToPenPal extends ToDoItemAbstract {
+
+    @Override
+    protected void execute(ExecutionContext executionContext) {
+
+        createToDoItem(
+                "Write to penpal",
+                Category.Other, Subcategory.Other,
+                null,
+                null,
+                executionContext);
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/items/delete/ToDoItemsDelete.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/items/delete/ToDoItemsDelete.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/delete/ToDoItemsDelete.java
new file mode 100644
index 0000000..d83f80a
--- /dev/null
+++ b/example/application/todoapp/fixture/src/main/java/fixture/todo/items/delete/ToDoItemsDelete.java
@@ -0,0 +1,53 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package fixture.todo.items.delete;
+
+import org.apache.isis.applib.fixturescripts.FixtureScript;
+import org.apache.isis.applib.services.jdosupport.IsisJdoSupport;
+
+public class ToDoItemsDelete extends FixtureScript {
+
+    //region > ownedBy (optional)
+    private String ownedBy;
+
+    public String getOwnedBy() {
+        return ownedBy;
+    }
+
+    public void setOwnedBy(String ownedBy) {
+        this.ownedBy = ownedBy;
+    }
+    //endregion
+
+    //region > execute
+    protected void execute(ExecutionContext executionContext) {
+
+        final String ownedBy = executionContext.getParameter("ownedBy");
+
+        isisJdoSupport.executeUpdate("delete from \"ToDoItem\" where \"ownedBy\" = '" + ownedBy + "'");
+    }
+
+    //endregion
+
+    //region > injected services
+    @javax.inject.Inject
+    private IsisJdoSupport isisJdoSupport;
+    //endregion
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/75735601/example/application/todoapp/fixture/src/main/java/fixture/todo/scenarios/DeleteToDoItemsFor.java
----------------------------------------------------------------------
diff --git a/example/application/todoapp/fixture/src/main/java/fixture/todo/scenarios/DeleteToDoItemsFor.java b/example/application/todoapp/fixture/src/main/java/fixture/todo/scenarios/DeleteToDoItemsFor.java
deleted file mode 100644
index b07271c..0000000
--- a/example/application/todoapp/fixture/src/main/java/fixture/todo/scenarios/DeleteToDoItemsFor.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package fixture.todo.scenarios;
-
-import fixture.todo.simple.ToDoItemsDelete;
-
-import com.google.common.base.Strings;
-
-public class DeleteToDoItemsFor extends ToDoItemsDelete {
-
-    public DeleteToDoItemsFor() {
-        super(null);
-        withDiscoverability(Discoverability.DISCOVERABLE);
-    }
-    
-    @Override
-    public String validateRun(final String parameters) {
-        return Strings.isNullOrEmpty(parameters) ? "Specify the owner of the ToDoItems to be deleted" : null;
-    }
-}
\ No newline at end of file