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 2021/06/07 09:16:32 UTC

[isis] 02/02: ISIS-2717: improves fixture scripts docs; moves classes around

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch ISIS-2717
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 24f51271766a7776aad2178db59a464f099915f9
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Mon Jun 7 10:00:55 2021 +0100

    ISIS-2717: improves fixture scripts docs; moves classes around
---
 .../index/fixtures/applib/clock/clock/Clock.adoc   |  80 ++++++++++++++
 .../fixtures/applib/clock/clock/FixtureClock.adoc  | 117 +++++++++++++++++++++
 .../applib/clock/clock/TickingFixtureClock.adoc    |  89 ++++++++++++++++
 .../fixture/TickingClockFixture.adoc}              |  11 +-
 .../FixturesInstalledEvent.adoc}                   |   8 +-
 .../FixturesInstallingEvent.adoc}                  |   9 +-
 .../applib/fixturescripts/FixtureScript.adoc       |  13 ---
 ...doc => FixtureScriptWithExecutionStrategy.adoc} |  16 +--
 .../applib/fixturescripts/FixtureScripts.adoc      |  26 ++++-
 .../fixturespec/FixtureScriptsSpecification.adoc   |   4 +-
 .../BuilderScriptAbstract.adoc                     |   6 +-
 .../BuilderScriptWithResult.adoc                   |  18 +++-
 .../BuilderScriptWithoutResult.adoc                |  16 ++-
 .../applib/personas/PersonaWithBuilderScript.adoc  |  29 +++++
 .../applib/personas/PersonaWithFinder.adoc         |  29 +++++
 .../WithPrereqs.adoc}                              |  17 +--
 .../FixturesLifecycleService.adoc}                 |  11 +-
 core/adoc/modules/_overview/pages/about.adoc       |   2 +-
 .../config/pages/sections/isis.testing.adoc        |  16 +--
 .../pages/fixture-scripts/api-and-usage.adoc       |  41 ++++++--
 .../IsisIntegrationTestAbstractWithFixtures.java   |  10 +-
 .../applib/clock/{fixture => }/ClockFixture.java   |   8 +-
 .../clock/{fixture => }/TickingClockFixture.java   |  10 +-
 .../fixtures/applib/clock/{ => clock}/Clock.java   |   2 +-
 .../applib/clock/{ => clock}/FixtureClock.java     |   2 +-
 .../clock/{ => clock}/TickingFixtureClock.java     |   2 +-
 .../applib/fixturescripts/FixtureScript.java       |  12 +--
 .../FixtureScriptWithExecutionStrategy.java        |   2 +-
 .../applib/fixturescripts/FixtureScripts.java      |  22 +++-
 .../fixturespec/FixtureScriptsSpecification.java   |   2 +-
 .../BuilderScriptAbstract.java                     |  11 +-
 .../BuilderScriptWithResult.java                   |   4 +-
 .../BuilderScriptWithoutResult.java                |   2 +-
 .../PersonaWithBuilderScript.java                  |   4 +-
 .../{api => personas}/PersonaWithFinder.java       |   3 +-
 .../applib/{api => personas}/WithPrereqs.java      |   3 +-
 .../applib/services/FixturesLifecycleService.java  |   4 +-
 .../applib/setup/PersonaEnumPersistAll.java        |   6 +-
 .../legacy/FixtureClockInstantiationTest.java      |   4 +-
 39 files changed, 544 insertions(+), 127 deletions(-)

diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/clock/clock/Clock.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/clock/clock/Clock.adoc
new file mode 100644
index 0000000..87a42a5
--- /dev/null
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/clock/clock/Clock.adoc
@@ -0,0 +1,80 @@
+= Clock
+:Notice: 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 ag [...]
+
+Provides a mechanism to get (and possible to set) the current time.
+
+The clock is used primarily by the temporal value classes, and is accessed by the framework as a singleton. The actual implementation used can be configured at startup, but once specified the clock instance cannot be changed.
+
+Unless another xref:refguide:testing:index/fixtures/applib/clock/clock/Clock.adoc[Clock] implementation has been installed, the first call to _#getInstance()_ will instantiate an implementation that just uses the system's own clock. Alternate implementations can be created via suitable subclasses, but this must be done * _before_ * the first call to _#getInstance()_ .
+
+== API
+
+[source,java]
+.Clock.java
+----
+class Clock {
+  Clock getInstance()     // <.>
+  boolean isInitialized()     // <.>
+  long getEpochMillis()     // <.>
+  LocalDate getTimeAsLocalDate()
+  LocalDateTime getTimeAsLocalDateTime()
+  OffsetDateTime getTimeAsOffsetDateTime()     // <.>
+  Timestamp getTimeAsJavaSqlTimestamp()
+  DateTime getTimeAsJodaDateTime()     // <.>
+}
+----
+
+<.> xref:#getInstance__[getInstance()]
++
+--
+Returns the (singleton) instance of xref:refguide:testing:index/fixtures/applib/clock/clock/Clock.adoc[Clock] .
+--
+<.> xref:#isInitialized__[isInitialized()]
++
+--
+Whether has been initialized or not.
+--
+<.> xref:#getEpochMillis__[getEpochMillis()]
++
+--
+The time as the number of milliseconds since the epoch start. (UTC)
+--
+<.> xref:#getTimeAsOffsetDateTime__[getTimeAsOffsetDateTime()]
++
+--
+Returns the time as _OffsetDateTime_ , using the _ZoneId#systemDefault() system default_ timezone.
+--
+<.> xref:#getTimeAsJodaDateTime__[getTimeAsJodaDateTime()]
++
+--
+Returns the time as a Joda _DateTime_ , using the _ZoneId#systemDefault() system default_ timezone.
+--
+
+== Members
+
+[#getInstance__]
+=== getInstance()
+
+Returns the (singleton) instance of xref:refguide:testing:index/fixtures/applib/clock/clock/Clock.adoc[Clock] .
+
+Unless it has been otherwise created, will lazily instantiate an implementation that just delegate to the computer's own system clock (as per _System#currentTimeMillis()_ .
+
+[#isInitialized__]
+=== isInitialized()
+
+Whether has been initialized or not.
+
+[#getEpochMillis__]
+=== getEpochMillis()
+
+The time as the number of milliseconds since the epoch start. (UTC)
+
+[#getTimeAsOffsetDateTime__]
+=== getTimeAsOffsetDateTime()
+
+Returns the time as _OffsetDateTime_ , using the _ZoneId#systemDefault() system default_ timezone.
+
+[#getTimeAsJodaDateTime__]
+=== getTimeAsJodaDateTime()
+
+Returns the time as a Joda _DateTime_ , using the _ZoneId#systemDefault() system default_ timezone.
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/clock/clock/FixtureClock.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/clock/clock/FixtureClock.adoc
new file mode 100644
index 0000000..374e692
--- /dev/null
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/clock/clock/FixtureClock.adoc
@@ -0,0 +1,117 @@
+= FixtureClock
+:Notice: 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 ag [...]
+
+This clock, for use by fixtures, can be set to specific time.
+
+If not set it will provide the time provided by the system clock.
+
+Note that - by design - it does not provide any mechanism to advance the time (eg automatic ticking of the clock). That is, the time returned is always explicitly under the control of the programmer (it can be moved forward or back as required).
+
+== API
+
+[source,java]
+.FixtureClock.java
+----
+class FixtureClock {
+  FixtureClock initialize()     // <.>
+  boolean remove()     // <.>
+  void clear()     // <.>
+  void setTime(final int hour, final int min)     // <.>
+  void setDate(final int year, final int month, final int day)     // <.>
+  void addTime(final int hours, final int minutes)     // <.>
+  void addDate(final int years, final int months, final int days)     // <.>
+  void reset()     // <.>
+  String toString()
+}
+----
+
+<.> xref:#initialize__[initialize()]
++
+--
+Configures the system to use a FixtureClock rather than the in-built system clock. Can be called multiple times.
+--
+<.> xref:#remove__[remove()]
++
+--
+Makes _Clock#remove()_ visible.
+--
+<.> xref:#clear__[clear()]
++
+--
+Sets the clock to epoch, that is midnight, 1 Jan 1970 UTC.
+--
+<.> xref:#setTime__int_int[setTime(int, int)]
++
+--
+Sets the hours and minutes as specified, and sets the seconds and milliseconds to zero, but the date portion is left unchanged.
+--
+<.> xref:#setDate__int_int_int[setDate(int, int, int)]
++
+--
+Sets the date, but the time portion is left unchanged.
+--
+<.> xref:#addTime__int_int[addTime(int, int)]
++
+--
+Adjusts the time by the specified number of hours and minutes.
+--
+<.> xref:#addDate__int_int_int[addDate(int, int, int)]
++
+--
+Adjusts the time by the specified number of years, months or days.
+--
+<.> xref:#reset__[reset()]
++
+--
+Go back to just returning the system's time.
+--
+
+== Members
+
+[#initialize__]
+=== initialize()
+
+Configures the system to use a FixtureClock rather than the in-built system clock. Can be called multiple times.
+
+Must call before any other call to _Clock#getInstance()_ .
+
+[#remove__]
+=== remove()
+
+Makes _Clock#remove()_ visible.
+
+[#clear__]
+=== clear()
+
+Sets the clock to epoch, that is midnight, 1 Jan 1970 UTC.
+
+This is typically called before either _#setDate(int, int, int)_ (so that time is set to midnight) and/or _#setTime(int, int)_ (so that date is set to a well known value).
+
+[#setTime__int_int]
+=== setTime(int, int)
+
+Sets the hours and minutes as specified, and sets the seconds and milliseconds to zero, but the date portion is left unchanged.
+
+[#setDate__int_int_int]
+=== setDate(int, int, int)
+
+Sets the date, but the time portion is left unchanged.
+
+[#addTime__int_int]
+=== addTime(int, int)
+
+Adjusts the time by the specified number of hours and minutes.
+
+Typically called after _#setTime(int, int)_ , to move the clock forward or perhaps back.
+
+[#addDate__int_int_int]
+=== addDate(int, int, int)
+
+Adjusts the time by the specified number of years, months or days.
+
+Typically called after _#setDate(int, int, int)_ , to move the clock forward or perhaps back.
+
+[#reset__]
+=== reset()
+
+Go back to just returning the system's time.
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/clock/clock/TickingFixtureClock.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/clock/clock/TickingFixtureClock.adoc
new file mode 100644
index 0000000..c834f82
--- /dev/null
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/clock/clock/TickingFixtureClock.adoc
@@ -0,0 +1,89 @@
+= TickingFixtureClock
+:Notice: 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 ag [...]
+
+== API
+
+[source,java]
+.TickingFixtureClock.java
+----
+class TickingFixtureClock {
+  TickingFixtureClock replaceExisting()     // <.>
+  boolean reinstateExisting()     // <.>
+  void setTime(final int hour, final int min)     // <.>
+  void setTime(final Timestamp timestamp)
+  void setTime(final long millis)
+  void setDate(final int year, final int month, final int day)     // <.>
+  void addTime(final int hours, final int minutes)     // <.>
+  void addDate(final int years, final int months, final int days)     // <.>
+  String toString()
+}
+----
+
+<.> xref:#replaceExisting__[replaceExisting()]
++
+--
+Configures the system to use a FixtureClock rather than the in-built system clock. Can be called multiple times.
+--
+<.> xref:#reinstateExisting__[reinstateExisting()]
++
+--
+Makes _Clock#remove()_ visible.
+--
+<.> xref:#setTime__int_int[setTime(int, int)]
++
+--
+Sets the hours and minutes as specified, and sets the seconds and milliseconds to zero, but the date portion is left unchanged.
+--
+<.> xref:#setDate__int_int_int[setDate(int, int, int)]
++
+--
+Sets the date, but the time portion is left unchanged.
+--
+<.> xref:#addTime__int_int[addTime(int, int)]
++
+--
+Adjusts the time by the specified number of hours and minutes.
+--
+<.> xref:#addDate__int_int_int[addDate(int, int, int)]
++
+--
+Adjusts the time by the specified number of years, months or days.
+--
+
+== Members
+
+[#replaceExisting__]
+=== replaceExisting()
+
+Configures the system to use a FixtureClock rather than the in-built system clock. Can be called multiple times.
+
+Must call before any other call to _Clock#getInstance()_ .
+
+[#reinstateExisting__]
+=== reinstateExisting()
+
+Makes _Clock#remove()_ visible.
+
+[#setTime__int_int]
+=== setTime(int, int)
+
+Sets the hours and minutes as specified, and sets the seconds and milliseconds to zero, but the date portion is left unchanged.
+
+[#setDate__int_int_int]
+=== setDate(int, int, int)
+
+Sets the date, but the time portion is left unchanged.
+
+[#addTime__int_int]
+=== addTime(int, int)
+
+Adjusts the time by the specified number of hours and minutes.
+
+Typically called after _#setTime(int, int)_ , to move the clock forward or perhaps back.
+
+[#addDate__int_int_int]
+=== addDate(int, int, int)
+
+Adjusts the time by the specified number of years, months or days.
+
+Typically called after _#setDate(int, int, int)_ , to move the clock forward or perhaps back.
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithResult.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/clock/fixture/TickingClockFixture.adoc
similarity index 78%
copy from antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithResult.adoc
copy to antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/clock/fixture/TickingClockFixture.adoc
index f50ddc2..4bf657c 100644
--- a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithResult.adoc
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/clock/fixture/TickingClockFixture.adoc
@@ -1,14 +1,15 @@
-= BuilderScriptWithResult
+= TickingClockFixture
 :Notice: 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 ag [...]
 
 == API
 
 [source,java]
-.BuilderScriptWithResult.java
+.TickingClockFixture.java
 ----
-class BuilderScriptWithResult<T> {
-  @Getter(onMethod = @__({ @Override }))
-public T object;
+class TickingClockFixture {
+  String getDate()
+  TickingClockFixture setDate(final String date)
+  FixtureScripts.MultipleExecutionStrategy getMultipleExecutionStrategy()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithoutResult.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/events/FixturesInstalledEvent.adoc
similarity index 85%
copy from antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithoutResult.adoc
copy to antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/events/FixturesInstalledEvent.adoc
index d4588be..8e728e1 100644
--- a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithoutResult.adoc
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/events/FixturesInstalledEvent.adoc
@@ -1,13 +1,13 @@
-= BuilderScriptWithoutResult
+= FixturesInstalledEvent
 :Notice: 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 ag [...]
 
 == API
 
 [source,java]
-.BuilderScriptWithoutResult.java
+.FixturesInstalledEvent.java
 ----
-class BuilderScriptWithoutResult {
-  Object getObject()
+class FixturesInstalledEvent {
+  FixturesInstalledEvent(final Object source)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithResult.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/events/FixturesInstallingEvent.adoc
similarity index 84%
copy from antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithResult.adoc
copy to antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/events/FixturesInstallingEvent.adoc
index f50ddc2..3a299cd 100644
--- a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithResult.adoc
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/events/FixturesInstallingEvent.adoc
@@ -1,14 +1,13 @@
-= BuilderScriptWithResult
+= FixturesInstallingEvent
 :Notice: 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 ag [...]
 
 == API
 
 [source,java]
-.BuilderScriptWithResult.java
+.FixturesInstallingEvent.java
 ----
-class BuilderScriptWithResult<T> {
-  @Getter(onMethod = @__({ @Override }))
-public T object;
+class FixturesInstallingEvent {
+  FixturesInstallingEvent(final Object source)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/FixtureScript.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/FixtureScript.adoc
index 4a833c0..7d3099a 100644
--- a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/FixtureScript.adoc
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/FixtureScript.adoc
@@ -13,7 +13,6 @@ class FixtureScript {
   FixtureScript()     // <.>
   FixtureScript(final String friendlyName, final String localName)     // <.>
   String getQualifiedName()
-  List<FixtureResult> run(final String parameters, final FixtureScripts fixtureScripts)     // <.>
   String validateRun(final String parameters)     // <.>
   String pathWith(final String subkey)
 }
@@ -29,11 +28,6 @@ Initializes a fixture, with _#getFriendlyName()_ and _#getLocalName()_ derived f
 --
 Initializes a fixture.
 --
-<.> xref:#run__String_FixtureScripts[run(String, FixtureScripts)]
-+
---
-Entry point for xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScripts.adoc[FixtureScripts] service to call.
---
 <.> xref:#validateRun__String[validateRun(String)]
 +
 --
@@ -52,13 +46,6 @@ Initializes a fixture, with _#getFriendlyName()_ and _#getLocalName()_ derived f
 
 Initializes a fixture.
 
-[#run__String_FixtureScripts]
-=== run(String, FixtureScripts)
-
-Entry point for xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScripts.adoc[FixtureScripts] service to call.
-
-Package-visibility only, not public API.
-
 [#validateRun__String]
 === validateRun(String)
 
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptAbstract.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/FixtureScriptWithExecutionStrategy.adoc
similarity index 54%
copy from antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptAbstract.adoc
copy to antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/FixtureScriptWithExecutionStrategy.adoc
index 2649d1e..2113a91 100644
--- a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptAbstract.adoc
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/FixtureScriptWithExecutionStrategy.adoc
@@ -1,17 +1,17 @@
-= BuilderScriptAbstract
+= FixtureScriptWithExecutionStrategy _(interface)_
 :Notice: 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 ag [...]
 
+Interface for xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScript.adoc[FixtureScript] s to optionally implement, used to override the _FixtureScriptsSpecification#getMultipleExecutionStrategy() globally-defined_ _org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts.MultipleExecutionStrategy_ strategy.
+
+This therefore allows individual fixture scripts to indicate that they have their own execution strategy.
+
 == API
 
 [source,java]
-.BuilderScriptAbstract.java
+.FixtureScriptWithExecutionStrategy.java
 ----
-class BuilderScriptAbstract<T> {
-  BuilderScriptAbstract<T> build(final FixtureScript parentFixtureScript, final ExecutionContext executionContext)
-  T objectFor(final PersonaWithBuilderScript<BuilderScriptAbstract<T>> persona, final ExecutionContext executionContext)
-  T findUsing(final PersonaWithFinder<T> persona)
-  BuilderScriptAbstract<T> setPrereq(WithPrereqs.Block<T> prereq)
-  void execPrereqs(final ExecutionContext executionContext)
+interface FixtureScriptWithExecutionStrategy {
+  FixtureScripts.MultipleExecutionStrategy getMultipleExecutionStrategy()
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/FixtureScripts.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/FixtureScripts.adoc
index 33b60a1..32baafe 100644
--- a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/FixtureScripts.adoc
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/FixtureScripts.adoc
@@ -15,13 +15,13 @@ public static final String LOGICAL_TYPE_NAME;
   FixtureScripts(final FixtureScriptsSpecificationProvider fixtureScriptsSpecificationProvider, final ServiceRegistry serviceRegistry)
   NonPersistedObjectsStrategy getNonPersistedObjectsStrategy()
   MultipleExecutionStrategy getMultipleExecutionStrategy()     // <.>
-  List<FixtureResult> runFixtureScript(final String fixtureScriptName, final String parameters)
+  List<FixtureResult> runFixtureScript(final String fixtureScriptName, final String parameters)     // <.>
   List<FixtureResult> runFixtureScript(final FixtureScript fixtureScript, final String parameters)
   String disableRunFixtureScript()
   String default0RunFixtureScript()
   Set<String> choices0RunFixtureScript()
   String validateRunFixtureScript(final String fixtureScriptName, final String parameters)
-  Object recreateObjectsAndReturnFirst()
+  Object recreateObjectsAndReturnFirst()     // <.>
   boolean hideRecreateObjectsAndReturnFirst()
   void run(final FixtureScript... fixtureScriptList)
   void runPersonas(PersonaWithBuilderScript<? extends BuilderScriptAbstract<?>>... personaScripts)
@@ -50,6 +50,16 @@ The package prefix to search for fixture scripts. This default value will result
 --
 Global setting as to how to handle fixture scripts that are executed more than once. See _MultipleExecutionStrategy_ for more details.
 --
+<.> xref:#runFixtureScript__String_String[runFixtureScript(String, String)]
++
+--
+Main action - as exposed in the UI - to execute the specified fixture script.
+--
+<.> xref:#recreateObjectsAndReturnFirst__[recreateObjectsAndReturnFirst()]
++
+--
+Convenience action - exposed through the UI - to execute the specified "recreate" xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScript.adoc[FixtureScript] and return/show the first object returned by that fixture script.
+--
 <.> xref:#runBuilder__BuilderScriptAbstract[runBuilder(BuilderScriptAbstract)]
 +
 --
@@ -103,6 +113,18 @@ The package prefix to search for fixture scripts. This default value will result
 
 Global setting as to how to handle fixture scripts that are executed more than once. See _MultipleExecutionStrategy_ for more details.
 
+[#runFixtureScript__String_String]
+=== runFixtureScript(String, String)
+
+Main action - as exposed in the UI - to execute the specified fixture script.
+
+Also allows arbitrary parameters to be specified for said fixture script.
+
+[#recreateObjectsAndReturnFirst__]
+=== recreateObjectsAndReturnFirst()
+
+Convenience action - exposed through the UI - to execute the specified "recreate" xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScript.adoc[FixtureScript] and return/show the first object returned by that fixture script.
+
 [#runBuilder__BuilderScriptAbstract]
 === runBuilder(BuilderScriptAbstract)
 
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturespec/FixtureScriptsSpecification.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturespec/FixtureScriptsSpecification.adoc
index 2a67a30..216a632 100644
--- a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturespec/FixtureScriptsSpecification.adoc
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturespec/FixtureScriptsSpecification.adoc
@@ -28,7 +28,7 @@ Typically preferable to use the create using the _FixtureScriptsSpecification.Bu
 <.> xref:#getMultipleExecutionStrategy__[getMultipleExecutionStrategy()]
 +
 --
-Note that this can be overridden on a fixture-by-fixture basis if the fixture implements _FixtureScriptWithExecutionStrategy_ .
+Note that this can be overridden on a fixture-by-fixture basis if the fixture implements xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScriptWithExecutionStrategy.adoc[FixtureScriptWithExecutionStrategy] .
 --
 
 == Members
@@ -41,4 +41,4 @@ Typically preferable to use the create using the _FixtureScriptsSpecification.Bu
 [#getMultipleExecutionStrategy__]
 === getMultipleExecutionStrategy()
 
-Note that this can be overridden on a fixture-by-fixture basis if the fixture implements _FixtureScriptWithExecutionStrategy_ .
+Note that this can be overridden on a fixture-by-fixture basis if the fixture implements xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScriptWithExecutionStrategy.adoc[FixtureScriptWithExecutionStrategy] .
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptAbstract.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/BuilderScriptAbstract.adoc
similarity index 65%
copy from antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptAbstract.adoc
copy to antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/BuilderScriptAbstract.adoc
index 2649d1e..fa3822c 100644
--- a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptAbstract.adoc
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/BuilderScriptAbstract.adoc
@@ -1,6 +1,10 @@
 = BuilderScriptAbstract
 :Notice: 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 ag [...]
 
+A specialization of xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScript.adoc[FixtureScript] that is intended to be used to setup the state of a xref:refguide:testing:index/fixtures/applib/personas/PersonaWithBuilderScript.adoc[PersonaWithBuilderScript] .
+
+The xref:refguide:testing:index/fixtures/applib/personas/PersonaWithBuilderScript.adoc[PersonaWithBuilderScript] represents the "what", in other words the raw data, while the xref:refguide:testing:index/fixtures/applib/personas/BuilderScriptAbstract.adoc[BuilderScriptAbstract] represents the "how-to".
+
 == API
 
 [source,java]
@@ -10,7 +14,7 @@ class BuilderScriptAbstract<T> {
   BuilderScriptAbstract<T> build(final FixtureScript parentFixtureScript, final ExecutionContext executionContext)
   T objectFor(final PersonaWithBuilderScript<BuilderScriptAbstract<T>> persona, final ExecutionContext executionContext)
   T findUsing(final PersonaWithFinder<T> persona)
-  BuilderScriptAbstract<T> setPrereq(WithPrereqs.Block<T> prereq)
+  BuilderScriptAbstract<T> addPrereq(WithPrereqs.Block<T> prereq)
   void execPrereqs(final ExecutionContext executionContext)
 }
 ----
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithResult.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/BuilderScriptWithResult.adoc
similarity index 61%
copy from antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithResult.adoc
copy to antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/BuilderScriptWithResult.adoc
index f50ddc2..abfd6dd 100644
--- a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithResult.adoc
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/BuilderScriptWithResult.adoc
@@ -1,14 +1,28 @@
 = BuilderScriptWithResult
 :Notice: 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 ag [...]
 
+A specialization of xref:refguide:testing:index/fixtures/applib/personas/BuilderScriptAbstract.adoc[BuilderScriptAbstract] which expects there to be a top-level object, and so - by defining its own _#buildResult(ExecutionContext) hook method_ - removes a little of the boilerplate..
+
 == API
 
 [source,java]
 .BuilderScriptWithResult.java
 ----
 class BuilderScriptWithResult<T> {
-  @Getter(onMethod = @__({ @Override }))
-public T object;
+  public T object;
+  T getObject()     // <.>
 }
 ----
 
+<.> xref:#getObject__[getObject()]
++
+--
+Simply returns the object returned by _#buildResult(ExecutionContext)_ .
+--
+
+== Members
+
+[#getObject__]
+=== getObject()
+
+Simply returns the object returned by _#buildResult(ExecutionContext)_ .
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithoutResult.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/BuilderScriptWithoutResult.adoc
similarity index 69%
rename from antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithoutResult.adoc
rename to antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/BuilderScriptWithoutResult.adoc
index d4588be..2d53748 100644
--- a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithoutResult.adoc
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/BuilderScriptWithoutResult.adoc
@@ -1,13 +1,27 @@
 = BuilderScriptWithoutResult
 :Notice: 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 ag [...]
 
+A specialization of xref:refguide:testing:index/fixtures/applib/personas/BuilderScriptAbstract.adoc[BuilderScriptAbstract] which returns no top-level object, and so removes a little of the boilerplate that would otherwise be required.
+
 == API
 
 [source,java]
 .BuilderScriptWithoutResult.java
 ----
 class BuilderScriptWithoutResult {
-  Object getObject()
+  Object getObject()     // <.>
 }
 ----
 
+<.> xref:#getObject__[getObject()]
++
+--
+Simply returns null.
+--
+
+== Members
+
+[#getObject__]
+=== getObject()
+
+Simply returns null.
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/PersonaWithBuilderScript.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/PersonaWithBuilderScript.adoc
new file mode 100644
index 0000000..b725288
--- /dev/null
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/PersonaWithBuilderScript.adoc
@@ -0,0 +1,29 @@
+= PersonaWithBuilderScript _(interface)_
+:Notice: 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 ag [...]
+
+Intended for persona enums to implement, to provide an instance of a xref:refguide:testing:index/fixtures/applib/personas/BuilderScriptAbstract.adoc[BuilderScriptAbstract] in order to instantiate an instance of the persona (normally in the form of a domain entity or set of related domain entities).
+
+( xref:refguide:testing:index/fixtures/applib/personas/BuilderScriptAbstract.adoc[BuilderScriptAbstract] is a specialization of _org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript_ ).
+
+== API
+
+[source,java]
+.PersonaWithBuilderScript.java
+----
+interface PersonaWithBuilderScript<T> {
+  T builder()     // <.>
+}
+----
+
+<.> xref:#builder__[builder()]
++
+--
+Returns a xref:refguide:testing:index/fixtures/applib/personas/BuilderScriptAbstract.adoc[BuilderScriptAbstract] to use to instantiate this persona.
+--
+
+== Members
+
+[#builder__]
+=== builder()
+
+Returns a xref:refguide:testing:index/fixtures/applib/personas/BuilderScriptAbstract.adoc[BuilderScriptAbstract] to use to instantiate this persona.
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/PersonaWithFinder.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/PersonaWithFinder.adoc
new file mode 100644
index 0000000..8cd0fc1
--- /dev/null
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/PersonaWithFinder.adoc
@@ -0,0 +1,29 @@
+= PersonaWithFinder _(interface)_
+:Notice: 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 ag [...]
+
+Intended for persona enums to implement, to obtain an instance of the corresponding top-level entity representing the persona.
+
+== API
+
+[source,java]
+.PersonaWithFinder.java
+----
+interface PersonaWithFinder<T> {
+  T findUsing(final ServiceRegistry serviceRegistry)     // <.>
+}
+----
+
+<.> xref:#findUsing__ServiceRegistry[findUsing(ServiceRegistry)]
++
+--
+Looks up the top-level domain entity representing the persona, with the provided xref:refguide:applib:index/services/registry/ServiceRegistry.adoc[ServiceRegistry] parameter providing access to all domain services available.
+--
+
+== Members
+
+[#findUsing__ServiceRegistry]
+=== findUsing(ServiceRegistry)
+
+Looks up the top-level domain entity representing the persona, with the provided xref:refguide:applib:index/services/registry/ServiceRegistry.adoc[ServiceRegistry] parameter providing access to all domain services available.
+
+Typically the implementation looks up the appropriate domain-specific repository domain service (or could just use the generic _org.apache.isis.applib.services.repository.RepositoryService_ in order to find by key.
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptAbstract.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/WithPrereqs.adoc
similarity index 60%
rename from antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptAbstract.adoc
rename to antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/WithPrereqs.adoc
index 2649d1e..bbe3727 100644
--- a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptAbstract.adoc
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/personas/WithPrereqs.adoc
@@ -1,17 +1,18 @@
-= BuilderScriptAbstract
+= WithPrereqs _(interface)_
 :Notice: 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 ag [...]
 
+Provides a mechanism for xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScript.adoc[FixtureScript] s to specify prerequisites to be executed first.
+
+Most commonly used to chain xref:refguide:testing:index/fixtures/applib/personas/BuilderScriptAbstract.adoc[BuilderScriptAbstract] s in conjunction with personas.
+
 == API
 
 [source,java]
-.BuilderScriptAbstract.java
+.WithPrereqs.java
 ----
-class BuilderScriptAbstract<T> {
-  BuilderScriptAbstract<T> build(final FixtureScript parentFixtureScript, final ExecutionContext executionContext)
-  T objectFor(final PersonaWithBuilderScript<BuilderScriptAbstract<T>> persona, final ExecutionContext executionContext)
-  T findUsing(final PersonaWithFinder<T> persona)
-  BuilderScriptAbstract<T> setPrereq(WithPrereqs.Block<T> prereq)
-  void execPrereqs(final ExecutionContext executionContext)
+interface WithPrereqs<T> {
+  BuilderScriptAbstract<T> addPrereq(Block<T> prereq)
+  void execPrereqs(FixtureScript.ExecutionContext executionContext)
 }
 ----
 
diff --git a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithResult.adoc b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/services/FixturesLifecycleService.adoc
similarity index 81%
rename from antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithResult.adoc
rename to antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/services/FixturesLifecycleService.adoc
index f50ddc2..27d2d8f 100644
--- a/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/fixturescripts/BuilderScriptWithResult.adoc
+++ b/antora/components/refguide-index/modules/testing/pages/index/fixtures/applib/services/FixturesLifecycleService.adoc
@@ -1,14 +1,15 @@
-= BuilderScriptWithResult
+= FixturesLifecycleService
 :Notice: 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 ag [...]
 
 == API
 
 [source,java]
-.BuilderScriptWithResult.java
+.FixturesLifecycleService.java
 ----
-class BuilderScriptWithResult<T> {
-  @Getter(onMethod = @__({ @Override }))
-public T object;
+class FixturesLifecycleService {
+  void postConstruct()
+  void onMetamodelEvent(final MetamodelEvent event)
+  void preDestroy()
 }
 ----
 
diff --git a/core/adoc/modules/_overview/pages/about.adoc b/core/adoc/modules/_overview/pages/about.adoc
index 87bb303..5d2f00d 100644
--- a/core/adoc/modules/_overview/pages/about.adoc
+++ b/core/adoc/modules/_overview/pages/about.adoc
@@ -527,7 +527,7 @@ org.apache.isis.testing:isis-testing-integtestsupport-applib:jar:<managed> +
 
 .Document Index Entries
 ****
-xref:refguide:testing:index/fixtures/applib/IsisIntegrationTestAbstractWithFixtures.adoc[IsisIntegrationTestAbstractWithFixtures], xref:refguide:testing:index/fixtures/applib/fixturescripts/BuilderScriptAbstract.adoc[BuilderScriptAbstract], xref:refguide:testing:index/fixtures/applib/fixturescripts/BuilderScriptWithResult.adoc[BuilderScriptWithResult], xref:refguide:testing:index/fixtures/applib/fixturescripts/BuilderScriptWithoutResult.adoc[BuilderScriptWithoutResult], xref:refguide:tes [...]
+xref:refguide:testing:index/fixtures/applib/IsisIntegrationTestAbstractWithFixtures.adoc[IsisIntegrationTestAbstractWithFixtures], xref:refguide:testing:index/fixtures/applib/clock/clock/Clock.adoc[Clock], xref:refguide:testing:index/fixtures/applib/clock/clock/FixtureClock.adoc[FixtureClock], xref:refguide:testing:index/fixtures/applib/clock/clock/TickingFixtureClock.adoc[TickingFixtureClock], xref:refguide:testing:index/fixtures/applib/clock/fixture/TickingClockFixture.adoc[TickingCloc [...]
 ****
 
 |Apache Isis Tst - H2 Console (parent)
diff --git a/core/config/src/main/adoc/modules/config/pages/sections/isis.testing.adoc b/core/config/src/main/adoc/modules/config/pages/sections/isis.testing.adoc
index 74735da..86e4ae5 100644
--- a/core/config/src/main/adoc/modules/config/pages/sections/isis.testing.adoc
+++ b/core/config/src/main/adoc/modules/config/pages/sections/isis.testing.adoc
@@ -17,7 +17,7 @@ isis.testing.fixtures. +
 fixture-scripts-specification. +
 context-class
 
-| 
+|
 | Specifies the base package from which to search for fixture scripts.
 
 Either this or packagePrefix must be specified. This property is used by preference.
@@ -31,12 +31,12 @@ isis.testing.fixtures. +
 fixture-scripts-specification. +
 multiple-execution-strategy
 
-| 
+|
 | Indicates whether, if a fixture script (or more precisely any other fixture scripts of the same class) is encountered more than once in a graph of dependencies, it should be executed again or skipped.
 
 The default is to fixture scripts are executed only once per class.
 
-Note that this policy can be overridden on a fixture-by-fixture basis if the fixture implements ``FixtureScriptWithExecutionStrategy``.
+Note that this policy can be overridden on a fixture-by-fixture basis if the fixture implements xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScriptWithExecutionStrategy.adoc[ FixtureScriptWithExecutionStrategy].
 
 
 |
@@ -45,7 +45,7 @@ isis.testing.fixtures. +
 fixture-scripts-specification. +
 non-persisted-objects-strategy
 
-| 
+|
 | Indicates whether objects that are returned as a fixture result should be automatically persisted if required (the default) or not.
 
 
@@ -55,7 +55,7 @@ isis.testing.fixtures. +
 fixture-scripts-specification. +
 package-prefix
 
-| 
+|
 | Specifies the base package from which to search for fixture scripts.
 
 Either this or ``#getContextClass()`` must be specified; ``#getContextClass()`` is used by preference.
@@ -69,7 +69,7 @@ isis.testing.fixtures. +
 fixture-scripts-specification. +
 recreate
 
-| 
+|
 | null
 
 
@@ -79,7 +79,7 @@ isis.testing.fixtures. +
 fixture-scripts-specification. +
 run-script-default
 
-| 
+|
 | null
 
 
@@ -88,7 +88,7 @@ run-script-default
 isis.testing.fixtures. +
 initial-script
 
-| 
+|
 | Indicates the fixture script class to run initially.
 
 Intended for use when prototyping against an in-memory database (but will run in production mode as well if required).
diff --git a/testing/fixtures/adoc/modules/fixtures/pages/fixture-scripts/api-and-usage.adoc b/testing/fixtures/adoc/modules/fixtures/pages/fixture-scripts/api-and-usage.adoc
index b672948..d00b9ea 100644
--- a/testing/fixtures/adoc/modules/fixtures/pages/fixture-scripts/api-and-usage.adoc
+++ b/testing/fixtures/adoc/modules/fixtures/pages/fixture-scripts/api-and-usage.adoc
@@ -93,7 +93,7 @@ This can be fine-tuned using `menubars.layout.xml`:
 </mb3:section>
 ----
 
-Let's now look at the `FixtureScript` class, where there's a bit more going on.
+Let's now look at the `FixtureScript` class, where there's a bit more to discuss.
 
 [#fixturescript]
 == `FixtureScript`
@@ -132,13 +132,16 @@ public class RecreateSimpleObjects extends FixtureScript {       // <.>
 
     @Override
     protected void execute(final ExecutionContext ec) {          // <.>
+
         // defaults
         final int number = defaultParam("number", ec, 3);        // <.>
+
         // validate
         if(number < 0 || number > NAMES.size()) {
             throw new IllegalArgumentException(
                 String.format("number must be in range [0,%d)", NAMES.size()));
         }
+
         // execute
         ec.executeChild(this, new SimpleObjectsTearDown());      // <.>
         for (int i = 0; i < number; i++) {
@@ -157,11 +160,12 @@ Note that the xref:testing:fakedata:about.adoc[Fakedata] testing module could al
 <.> input property: the number of objects to create, up to 10; for the calling test to specify, but note this is optional and has a default (see below).
 It's important that a wrapper class is used (ie `java.lang.Integer`, not `int`)
 <.> output property: the generated list of objects, for the calling test to grab
-<.> the mandatory execute(...) API
+<.> the mandatory `execute(...)` API.
+The xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScript~ExecutionContext.adoc[ExecutionContext] parameter is discussed in more detail in the <<executioncontext,next section>>.
 <.> the `defaultParam(...)` (inherited from `FixtureScript`) will default the `number` property (using Java's Reflection API) if none was specified
-<.> call another fixture script (`SimpleObjectsTearDown`) using the provided `ExecutionContext`.
+<.> call another fixture script (`SimpleObjectsTearDown`) using the provided xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScript~ExecutionContext.adoc[ExecutionContext].
 There's no need to instantiate using the xref:refguide:applib:index/services/factory/FactoryService.adoc[FactoryService].
-<.> calling another fixture script (`SimpleObjectCreate`) using the provided `ExecutionContext`
+<.> calling another fixture script (`SimpleObjectCreate`) using the provided xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScript~ExecutionContext.adoc[ExecutionContext]
 <.> adding the created object to the list, for the calling object to use.
 
 Because this script has exposed a "number" property, it's possible to set this from within the UI.
@@ -173,6 +177,21 @@ When this is executed, the framework will parse the text and attempt to reflecti
 So, in this case, when the fixture script is executed we actually get 6 objects created.
 
 
+[#executioncontext]
+== ExecutionContext
+
+The xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScript~ExecutionContext.adoc[ExecutionContext] is passed to each `FixtureScript` as it is executed.
+It supports two main use cases:
+
+* to allow child fixture scripts to be executed, using xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScript~ExecutionContext.adoc#executeChildT__FixtureScript_T[executeChild(...)] and its brethren.
++
+This was demonstrated in the <<fixturescript, previous section>>
+
+* to read parameters obtained when the fixture script was first executed by the xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScripts.adoc[FixtureScripts] domain service, discussed <<fixturescripts, above>>.
+
+The latter use case is much less frequently used, but can be helpful for example in demos, where the number of objects can be specified in the `parameters` parameter of the xref:refguide:testing:index/fixtures/applib/fixturescripts/FixtureScripts.adoc#runFixtureScript__String_String[run fixture script] action.
+
+
 == Personas and Builders
 
 Good integration tests are probably the best way to understand the behaviour of the domain model: better, even, than reading the code itself.
@@ -182,9 +201,9 @@ At the same time, "Persona" instances of entity classes help the developer becom
 For example, "Steve Single" the Customer might be 21, single and no kids, whereas vs "Meghan Married-Mum" the Customer might be married 35 with 2 kids.
 Using "Steve" vs "Meghan" immediately informs the developer about the particular scenario being explored.
 
-The xref:refguide:testing:index/fixtures/applib/fixturescripts/
-
-`PersonaWithBuilderScript` and `PersonaWithFinder` interfaces are intended to be implemented typically by "persona" enums, where each enum instance captures the essential data of some persona.
+The xref:refguide:testing:index/fixtures/applib/personas/PersonaWithBuilderScript.adoc[PersonaWithBuilderScript] and
+xref:refguide:testing:index/fixtures/applib/personas/PersonaWithFinder.adoc[PersonaWithFinder]
+ interfaces are intended to be implemented typically by "persona" enums, where each enum instance captures the essential data of some persona.
 So, going back to the previous example, we might have:
 
 [source,xml]
@@ -198,7 +217,7 @@ public enum Customer_persona
 }
 ----
 
-The `PersonaWithBuilderScript` interface means that this enum is able to act as a factory for a `BuilderScriptAbstract`.
+The xref:refguide:testing:index/fixtures/applib/personas/PersonaWithBuilderScript.adoc[PersonaWithBuilderScript] interface means that this enum is able to act as a factory for a xref:refguide:testing:index/fixtures/applib/personas/BuilderScriptAbstract.adoc[BuilderScriptAbstract].
 This is a specialization of `FixtureScript` that is used to actually create the entity (customer, or whatever), using the data taken out of the enum instance:
 
 [source,xml]
@@ -208,7 +227,7 @@ public interface PersonaWithBuilderScript<T, F extends BuilderScriptAbstract<T,F
 }
 ----
 
-The `PersonaWithFinder` interface meanwhile indicates that the enum can "lookup" its corresponding entity from the appropriate repository domain service:
+The xref:refguide:testing:index/fixtures/applib/personas/PersonaWithFinder.adoc[PersonaWithFinder] interface meanwhile indicates that the enum can "lookup" its corresponding entity from the appropriate repository domain service:
 
 [source,xml]
 ----
@@ -328,11 +347,11 @@ public class SimpleObject_IntegTest extends SimpleModuleIntegTestAbstract {
 
 Put together, the persona enums provide the "what" - hard-coded values for certain key data that the developer becomes very familiar with - while the builder provides the "how-to".
 
-These builder scripts (`BuilderScriptAbstract` implementations) can be used independently of the enum personas.
+These builder scripts (xref:refguide:testing:index/fixtures/applib/personas/BuilderScriptAbstract.adoc[BuilderScriptAbstract] implementations) can be used independently of the enum personas.
 And for more complex entity -where there might be many potential values that need to be provided
 - the builder script can automatically default some or even all of these values.
 
-For example, for a customer's date of birth, the buider could default to a date making the customer an adult, aged between 18 and 65, say.
+For example, for a customer's date of birth, the builder could default to a date making the customer an adult, aged between 18 and 65, say.
 For an email address or postal address, or an image, or some "lorem ipsum" text, the xref:testing:fakedata:about.adoc[Fakedata] testing module could provide randomised values.
 
 The benefit of an intelligent builder is that it further simplifies the test.
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/IsisIntegrationTestAbstractWithFixtures.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/IsisIntegrationTestAbstractWithFixtures.java
index 9a6bbfd..d6b3826 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/IsisIntegrationTestAbstractWithFixtures.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/IsisIntegrationTestAbstractWithFixtures.java
@@ -25,11 +25,11 @@ import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 
 import org.apache.isis.applib.services.clock.ClockService;
-import org.apache.isis.testing.fixtures.applib.api.PersonaWithBuilderScript;
-import org.apache.isis.testing.fixtures.applib.clock.Clock;
-import org.apache.isis.testing.fixtures.applib.clock.FixtureClock;
-import org.apache.isis.testing.fixtures.applib.clock.TickingFixtureClock;
-import org.apache.isis.testing.fixtures.applib.fixturescripts.BuilderScriptAbstract;
+import org.apache.isis.testing.fixtures.applib.personas.PersonaWithBuilderScript;
+import org.apache.isis.testing.fixtures.applib.clock.clock.Clock;
+import org.apache.isis.testing.fixtures.applib.clock.clock.FixtureClock;
+import org.apache.isis.testing.fixtures.applib.clock.clock.TickingFixtureClock;
+import org.apache.isis.testing.fixtures.applib.personas.BuilderScriptAbstract;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 import org.apache.isis.testing.fixtures.applib.modules.ModuleWithFixturesService;
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/fixture/ClockFixture.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/ClockFixture.java
similarity index 93%
rename from testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/fixture/ClockFixture.java
rename to testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/ClockFixture.java
index 75a7f13..419b481 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/fixture/ClockFixture.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/ClockFixture.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testing.fixtures.applib.clock.fixture;
+package org.apache.isis.testing.fixtures.applib.clock;
 
 import org.joda.time.LocalDate;
 import org.joda.time.LocalDateTime;
@@ -24,11 +24,11 @@ import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.testing.fixtures.applib.api.FixtureScriptWithExecutionStrategy;
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScriptWithExecutionStrategy;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
-import org.apache.isis.testing.fixtures.applib.clock.Clock;
-import org.apache.isis.testing.fixtures.applib.clock.FixtureClock;
+import org.apache.isis.testing.fixtures.applib.clock.clock.Clock;
+import org.apache.isis.testing.fixtures.applib.clock.clock.FixtureClock;
 
 @Programmatic
 class ClockFixture extends FixtureScript implements FixtureScriptWithExecutionStrategy {
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/fixture/TickingClockFixture.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/TickingClockFixture.java
similarity index 92%
rename from testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/fixture/TickingClockFixture.java
rename to testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/TickingClockFixture.java
index 889ffe0..80991af 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/fixture/TickingClockFixture.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/TickingClockFixture.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testing.fixtures.applib.clock.fixture;
+package org.apache.isis.testing.fixtures.applib.clock;
 
 import org.joda.time.LocalDate;
 import org.joda.time.LocalDateTime;
@@ -24,12 +24,12 @@ import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.testing.fixtures.applib.api.FixtureScriptWithExecutionStrategy;
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScriptWithExecutionStrategy;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
-import org.apache.isis.testing.fixtures.applib.clock.Clock;
-import org.apache.isis.testing.fixtures.applib.clock.FixtureClock;
-import org.apache.isis.testing.fixtures.applib.clock.TickingFixtureClock;
+import org.apache.isis.testing.fixtures.applib.clock.clock.Clock;
+import org.apache.isis.testing.fixtures.applib.clock.clock.FixtureClock;
+import org.apache.isis.testing.fixtures.applib.clock.clock.TickingFixtureClock;
 
 /**
  * @since 2.x {@index}
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/Clock.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/clock/Clock.java
similarity index 98%
rename from testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/Clock.java
rename to testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/clock/Clock.java
index 0770400..4637916 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/Clock.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/clock/Clock.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testing.fixtures.applib.clock;
+package org.apache.isis.testing.fixtures.applib.clock.clock;
 
 import java.sql.Timestamp;
 import java.time.Instant;
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/FixtureClock.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/clock/FixtureClock.java
similarity index 99%
rename from testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/FixtureClock.java
rename to testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/clock/FixtureClock.java
index a944dc3..4ab3aa7 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/FixtureClock.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/clock/FixtureClock.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testing.fixtures.applib.clock;
+package org.apache.isis.testing.fixtures.applib.clock.clock;
 
 import java.time.Instant;
 import java.util.Calendar;
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/TickingFixtureClock.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/clock/TickingFixtureClock.java
similarity index 98%
rename from testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/TickingFixtureClock.java
rename to testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/clock/TickingFixtureClock.java
index 26a47c5..6e8100d 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/TickingFixtureClock.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/clock/clock/TickingFixtureClock.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testing.fixtures.applib.clock;
+package org.apache.isis.testing.fixtures.applib.clock.clock;
 
 import java.sql.Timestamp;
 import java.time.Instant;
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScript.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScript.java
index fa61fc0..e45b6a0 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScript.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScript.java
@@ -49,9 +49,9 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.testing.fixtures.applib.api.FixtureScriptWithExecutionStrategy;
-import org.apache.isis.testing.fixtures.applib.api.PersonaWithBuilderScript;
-import org.apache.isis.testing.fixtures.applib.api.WithPrereqs;
+import org.apache.isis.testing.fixtures.applib.personas.BuilderScriptAbstract;
+import org.apache.isis.testing.fixtures.applib.personas.PersonaWithBuilderScript;
+import org.apache.isis.testing.fixtures.applib.personas.WithPrereqs;
 
 import lombok.Getter;
 import lombok.Setter;
@@ -781,10 +781,10 @@ public abstract class FixtureScript {
      * service to call.
      *
      * <p>
-     *     Package-visibility only, not public API.
+     *     Protected-visibility only, not public API.
      * </p>
      */
-    final List<FixtureResult> run(
+    protected final List<FixtureResult> run(
             final String parameters,
             final FixtureScripts fixtureScripts) {
         try {
@@ -910,7 +910,7 @@ public abstract class FixtureScript {
 
     @Inject protected FactoryService factoryService;
     @Inject protected ServiceRegistry serviceRegistry;
-    @Inject protected ServiceInjector serviceInjector;
+    @Inject @Getter @Programmatic protected ServiceInjector serviceInjector;
     @Inject protected RepositoryService repositoryService;
     @Inject protected UserService userService;
     @Inject protected WrapperFactory wrapperFactory;
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/api/FixtureScriptWithExecutionStrategy.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScriptWithExecutionStrategy.java
similarity index 96%
rename from testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/api/FixtureScriptWithExecutionStrategy.java
rename to testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScriptWithExecutionStrategy.java
index ca80e3c..cbfc3cb 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/api/FixtureScriptWithExecutionStrategy.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScriptWithExecutionStrategy.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testing.fixtures.applib.api;
+package org.apache.isis.testing.fixtures.applib.fixturescripts;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
index ba159e4..a49a50c 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/FixtureScripts.java
@@ -21,7 +21,6 @@ package org.apache.isis.testing.fixtures.applib.fixturescripts;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.Optional;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
@@ -53,7 +52,8 @@ import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.testing.fixtures.applib.IsisModuleTestingFixturesApplib;
-import org.apache.isis.testing.fixtures.applib.api.PersonaWithBuilderScript;
+import org.apache.isis.testing.fixtures.applib.personas.BuilderScriptAbstract;
+import org.apache.isis.testing.fixtures.applib.personas.PersonaWithBuilderScript;
 import org.apache.isis.testing.fixtures.applib.events.FixturesInstalledEvent;
 import org.apache.isis.testing.fixtures.applib.events.FixturesInstallingEvent;
 import org.apache.isis.testing.fixtures.applib.fixturespec.FixtureScriptsSpecification;
@@ -245,6 +245,17 @@ public class FixtureScripts {
 
     // -- runFixtureScript (using choices as the drop-down policy)
 
+    /**
+     * Main action - as exposed in the UI - to execute the specified fixture script.
+     *
+     * <p>
+     *     Also allows arbitrary parameters to be specified for said fixture script.
+     * </p>
+     *
+     * @param fixtureScriptName
+     * @param parameters
+     * @return
+     */
     @Action(
             restrictTo = RestrictTo.PROTOTYPING
     )
@@ -330,6 +341,13 @@ public class FixtureScripts {
 
     // -- recreateObjectsAndReturnFirst
 
+    /**
+     * Convenience action - exposed through the UI - to execute the specified
+     * &quot;recreate&quot; {@link FixtureScript fixture script} and
+     * return/show the first object returned by that fixture script.
+     *
+     * @return
+     */
     @Action(
             restrictTo = RestrictTo.PROTOTYPING
     )
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecification.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecification.java
index a3b74c4..9688bfe 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecification.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturespec/FixtureScriptsSpecification.java
@@ -19,7 +19,7 @@
 package org.apache.isis.testing.fixtures.applib.fixturespec;
 
 import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.testing.fixtures.applib.api.FixtureScriptWithExecutionStrategy;
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScriptWithExecutionStrategy;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureResultList;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptAbstract.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/BuilderScriptAbstract.java
similarity index 89%
rename from testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptAbstract.java
rename to testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/BuilderScriptAbstract.java
index 1b475ee..e8b1ada 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptAbstract.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/BuilderScriptAbstract.java
@@ -16,16 +16,15 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testing.fixtures.applib.fixturescripts;
+package org.apache.isis.testing.fixtures.applib.personas;
 
 import java.util.List;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.testing.fixtures.applib.api.FixtureScriptWithExecutionStrategy;
-import org.apache.isis.testing.fixtures.applib.api.PersonaWithBuilderScript;
-import org.apache.isis.testing.fixtures.applib.api.PersonaWithFinder;
-import org.apache.isis.testing.fixtures.applib.api.WithPrereqs;
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScriptWithExecutionStrategy;
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 
 import lombok.Getter;
 
@@ -69,7 +68,7 @@ extends FixtureScript implements WithPrereqs<T>, FixtureScriptWithExecutionStrat
             final FixtureScript parentFixtureScript,
             final ExecutionContext executionContext) {
 
-        parentFixtureScript.serviceInjector.injectServicesInto(this);
+        parentFixtureScript.getServiceInjector().injectServicesInto(this);
 
         execPrereqs(executionContext);
 
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptWithResult.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/BuilderScriptWithResult.java
similarity index 95%
rename from testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptWithResult.java
rename to testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/BuilderScriptWithResult.java
index 8569f05..3f6b282 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptWithResult.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/BuilderScriptWithResult.java
@@ -16,12 +16,10 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testing.fixtures.applib.fixturescripts;
+package org.apache.isis.testing.fixtures.applib.personas;
 
 import org.apache.isis.applib.annotation.Programmatic;
 
-import lombok.Getter;
-
 /**
  * A specialization of {@link BuilderScriptAbstract} which expects there to be
  * a top-level object, and so - by defining its own {@link #buildResult(ExecutionContext) hook method} - removes a little of the boilerplate..
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptWithoutResult.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/BuilderScriptWithoutResult.java
similarity index 95%
rename from testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptWithoutResult.java
rename to testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/BuilderScriptWithoutResult.java
index 22ce0e0..3ce2197 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/fixturescripts/BuilderScriptWithoutResult.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/BuilderScriptWithoutResult.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testing.fixtures.applib.fixturescripts;
+package org.apache.isis.testing.fixtures.applib.personas;
 
 /**
  * A specialization of {@link BuilderScriptAbstract} which returns no
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/api/PersonaWithBuilderScript.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/PersonaWithBuilderScript.java
similarity index 91%
rename from testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/api/PersonaWithBuilderScript.java
rename to testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/PersonaWithBuilderScript.java
index 1a87795..a9eafd0 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/api/PersonaWithBuilderScript.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/PersonaWithBuilderScript.java
@@ -16,9 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testing.fixtures.applib.api;
-
-import org.apache.isis.testing.fixtures.applib.fixturescripts.BuilderScriptAbstract;
+package org.apache.isis.testing.fixtures.applib.personas;
 
 /**
  * Intended for persona enums to implement, to provide an instance of a {@link BuilderScriptAbstract} in order to
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/api/PersonaWithFinder.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/PersonaWithFinder.java
similarity index 92%
rename from testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/api/PersonaWithFinder.java
rename to testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/PersonaWithFinder.java
index 1c585e2..7275880 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/api/PersonaWithFinder.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/PersonaWithFinder.java
@@ -16,10 +16,9 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testing.fixtures.applib.api;
+package org.apache.isis.testing.fixtures.applib.personas;
 
 import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.testing.fixtures.applib.fixturescripts.BuilderScriptAbstract;
 
 /**
  * Intended for persona enums to implement, to obtain an instance of the corresponding top-level entity representing
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/api/WithPrereqs.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/WithPrereqs.java
similarity index 91%
rename from testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/api/WithPrereqs.java
rename to testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/WithPrereqs.java
index 44539d1..71a528b 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/api/WithPrereqs.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/personas/WithPrereqs.java
@@ -16,9 +16,8 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.testing.fixtures.applib.api;
+package org.apache.isis.testing.fixtures.applib.personas;
 
-import org.apache.isis.testing.fixtures.applib.fixturescripts.BuilderScriptAbstract;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
 
 /**
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/services/FixturesLifecycleService.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/services/FixturesLifecycleService.java
index 19e7c1b..f7397ba 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/services/FixturesLifecycleService.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/services/FixturesLifecycleService.java
@@ -35,8 +35,8 @@ import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.config.environment.IsisSystemEnvironment;
 import org.apache.isis.core.interaction.session.InteractionFactory;
 import org.apache.isis.core.metamodel.events.MetamodelEvent;
-import org.apache.isis.testing.fixtures.applib.clock.Clock;
-import org.apache.isis.testing.fixtures.applib.clock.FixtureClock;
+import org.apache.isis.testing.fixtures.applib.clock.clock.Clock;
+import org.apache.isis.testing.fixtures.applib.clock.clock.FixtureClock;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 
diff --git a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/setup/PersonaEnumPersistAll.java b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/setup/PersonaEnumPersistAll.java
index 5ae75a0..ccde6ab 100644
--- a/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/setup/PersonaEnumPersistAll.java
+++ b/testing/fixtures/applib/src/main/java/org/apache/isis/testing/fixtures/applib/setup/PersonaEnumPersistAll.java
@@ -22,9 +22,9 @@ import java.util.List;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.testing.fixtures.applib.api.FixtureScriptWithExecutionStrategy;
-import org.apache.isis.testing.fixtures.applib.api.PersonaWithBuilderScript;
-import org.apache.isis.testing.fixtures.applib.fixturescripts.BuilderScriptAbstract;
+import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScriptWithExecutionStrategy;
+import org.apache.isis.testing.fixtures.applib.personas.PersonaWithBuilderScript;
+import org.apache.isis.testing.fixtures.applib.personas.BuilderScriptAbstract;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScript;
 import org.apache.isis.testing.fixtures.applib.fixturescripts.FixtureScripts;
 
diff --git a/testing/fixtures/applib/src/test/java/org/apache/isis/testing/fixtures/applib/legacy/FixtureClockInstantiationTest.java b/testing/fixtures/applib/src/test/java/org/apache/isis/testing/fixtures/applib/legacy/FixtureClockInstantiationTest.java
index c57c3a9..5d82271 100644
--- a/testing/fixtures/applib/src/test/java/org/apache/isis/testing/fixtures/applib/legacy/FixtureClockInstantiationTest.java
+++ b/testing/fixtures/applib/src/test/java/org/apache/isis/testing/fixtures/applib/legacy/FixtureClockInstantiationTest.java
@@ -27,8 +27,8 @@ import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
-import org.apache.isis.testing.fixtures.applib.clock.Clock;
-import org.apache.isis.testing.fixtures.applib.clock.FixtureClock;
+import org.apache.isis.testing.fixtures.applib.clock.clock.Clock;
+import org.apache.isis.testing.fixtures.applib.clock.clock.FixtureClock;
 
 public class FixtureClockInstantiationTest {