<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Pyramidion: a framework for domain-specific editors</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Yann Le Gof</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Pierre Laborde</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Alain Plantec</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Éric Le Pors</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>THALES Defense Mission Systems France - Etablissement de Brest</institution>
          ,
          <addr-line>10 Avenue de la 1'ere DFL, 29200 Brest</addr-line>
          ,
          <country country="FR">France</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Univ. Brest, Lab-STICC</institution>
          ,
          <addr-line>CNRS, UMR 6285, F-29200 Brest</addr-line>
          ,
          <country country="FR">France</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>Developing User Interfaces (UI) for software can be tedious without tools to visualize, modify and test. A Graphical User Interface (GUI) builder could simplify the development process of an UI. In this paper we present Pyramidion, a framework to implement domain-specific editor to show and modify the properties of any objects. We used Pyramidion to generate Pyramid, a GUI builder that can modify the properties of graphical elements that compose an UI. In this paper we will present the general concept behind Pyramidion through the example of Pyramid.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;Smalltalk</kwd>
        <kwd>Pharo</kwd>
        <kwd>domain-specific editor</kwd>
        <kwd>GUI builder</kwd>
        <kwd>UI</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>In this paper, we present the following contributions: the definition of a domain-specific editor in
Section 2, an example of a domain-specific editor in Section 3, the Pyramidion core architecture in
Section 4, how we implemented Pyramidion in Pharo in Section 5, pyramid, the GUI builder created
with Pyramidion in Section 6, related works in Section 7, finally we conclude the paper in Section 8.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Definition of a Domain Specific Editor</title>
      <p>
        A domain-specific editor is an application that helps a user to modify or to create a domain-specific
model composed of domain-specific objects. Improving software can be long and tedious [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ] without a
good understanding of its structure. An editor with a dedicated UI to modify the diferent objects of the
model can be faster than a text-based one and can help unexperimented users to better understand the
domain in which they are working [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ].
      </p>
      <p>We developed Pyramidion, a framework to create domain-specific editors. Pyramidion reduces the
efort the developers need to make to create a working editor for a specific-domain. They have to
specify the accessors and mutators of the model, the associated views, and the needed editor behaviors
for the specific-domain.</p>
    </sec>
    <sec id="sec-3">
      <title>3. Example of a domain-specific editor</title>
      <p>• On the left (1), a panel that is made of tabs, currently there is one tab named Tree. It shows a kind
of inspector for the graphic element tree that is manipulated by the domain-specific editor; the
inspector allows the user to select one or several elements of this tree;
• On the center (not numbered), a panel to render the trafic light (the domain model view) and the
current selection. Any valid change in the graphic element tree is rendered on this panel;
• On the right (3), a panel also made of multiple tabs; the tab named Visuals is selected. The
associated panel contains a specific editor for the background color property of the currently
selected graphic element (2);
1
2
3</p>
      <p>In order to edit a particular property (e.g. the background color) of a graphical element inside a
tree, a user first selects the targeted graphic element in the tree inspector. Then the property views
are updated according to the selected graphic element. Finally, the user can use the specific editor for
the background color property to see the current color of the selected elements and change its value.
Therefore, a domain-specific editor is made of 3 subsystems:
• Panel Builder Manager, to modify and extend the user interface of the editor.
• Selection System, to select the elements inside a tree of elements.
• Command System, to view and update the properties of the selected elements.</p>
      <p>TPlugin
+ configureBuilder(Builder)
+ addPanelOn(Panel Builder Manager)
+ connectOn(Editor)
Panel Builder</p>
      <p>Manager</p>
      <p>Builder
+ build() : Editor</p>
      <p>Editor</p>
      <p>create
Selection System</p>
      <p>Command System</p>
    </sec>
    <sec id="sec-4">
      <title>4. Pyramidion architecture</title>
      <p>The architecture of Pyramidion is based on the use of plugins. The architecture is shown in Figure 2. In
the context of Pyramidion, a plugin is programmed as a class to add specific features to a domain-specific
editor. All plugins of a specific editor are managed by a builder. Then, a specific editor consists in a
builder and a set of plugins. Any plugin can interact with the 3 subsystems of the specific editor: the
Panel Builder Manager, the Selection System and the Command System (in grey in Figure 2).</p>
      <sec id="sec-4-1">
        <title>For the example in section 3 we need 3 plugins:</title>
        <p>• MainUIPlugin, a plugin to describe the diferent panels of the UI of our editor.
• TreePlugin, a plugin to select the graphical elements.</p>
        <p>• BackgroundPlugin, a plugin to display and modify the current value of the background.</p>
        <p>Each phase running consists in the sending of a specific message by the builder to its registered plugins.
Therefore a plugin class must implement 3 methods: #configureBuilder: for the configuration
phase, #addPanelOn: for the panel adding phase and #connectOn: for finalization of the editor
building.
PyramidionBuilder
:Builder</p>
        <sec id="sec-4-1-1">
          <title>Background :Plugin</title>
        </sec>
        <sec id="sec-4-1-2">
          <title>TreePlugin :Plugin MainUIPlugin :Plugin</title>
          <p>build</p>
          <p>configureBuilder:
1
2
3
«Editor»
addPanelsOn:
connectOn:
configureBuilder:
«modify»
addPanelsOn:
connectOn:
configureBuilder:
addPanelsOn:
« create »
connectOn:
« create » :Panel Builder
Manager
« extend »
« extend »
« extend »
« extend »
« extend »
« extend »</p>
        </sec>
        <sec id="sec-4-1-3">
          <title>Pyramid :Editor</title>
          <p>The next sections describe how the builder uses theses 3 plugins to construct the domain specific
editor.
4.1. Configuration of the builder and creating the view of the editor
The view of a domain-specific editor is composed of widgets. The widgets are: the buttons, the lists,
the panels, the textfields, the menus etc. The users will use the widgets to see and modify the
domainspecific model or to use transversal capabilities (like the undo-redo). Pyramidion uses the widgets of
the system to display the UI of the domain-specific editors. The Widget Adaptaters are used as
adapters between the widgets of the system and the Pyramidion editor.</p>
          <p>The Widget Adaptaters are created by the plugins using the Panel Builders of the Panel
Builders Manager (see Figure 4). Then they are added to the Panel Builder that created them.</p>
          <p>The Panel Builders Manager contains multiple Panel Builders. Each Panel Builder
assembles the diferent widgets inside the Widget Adaptaters to form a panel. Panel Builders
Manager uses the panels (that contains the diferent widgets) to create the view of the editors.</p>
          <p>There are diferent types of Panel Builder. Each type of Panel Builder depends on the
necessary widget types to create the domain-specific editor. If developers want to add a new widget
type for its editors, they will have to create a dedicated Panel Builder that creates those new widgets
and assembles them in a panel. For our current use of Pyramidion, 4 diferent Panel Builders are
defined :
• Notebook, where each widget is a new view inside a tab.
• Buttons bar, where each widget is a button.
• Single panel, where only one widget corresponding to a view is displayed.</p>
          <p>• Menu, where each widget is a menu item or a group of menu items.</p>
          <p>The method #configureBuilder: of the plugins is used by the builder to configure itself (see
phase 1 in Figure 3). Any plugin can change the default Panel Builders Manager of the builder, it
also have to define the diferent Panel Builders that will be used to create the editor.</p>
          <p>The #addPanelOn: of the plugins is used by the builder to create new widget Adaptaters during
phase 2 in Figure 3. Any plugin can add any number of widget Adaptaters to the diferent Panel
Builders. The Widget Adaptater comes with a priority value used when multiple widget Adapters
want to be added on the same Panel Builders. The priority value will be used to define the order of
the widgets on the Panel Builders. This priority value is an arbitrary value defined by the developer
of the plugin.</p>
          <p>Plugin
0..1</p>
          <p>Panel Builders</p>
          <p>Manager
*
creates</p>
          <p>*
Panel Builder</p>
          <p>Widget Adaptater
Creates the Widget Adaptaters
using the Panel Builder and
adds them to the Panel Builder</p>
          <p>Notebook Panel</p>
          <p>Builder</p>
          <p>Buttons Bar Panel</p>
          <p>Builder</p>
          <p>Single Panel</p>
          <p>Builder</p>
          <p>Menu Panel Builder</p>
          <p>In our example The Panel Builders Manager is created by the MainUIPlugin during the
configuration phase (see Figure 3). The Panel Builders Manager has two Notebook Panel Builders
to add the widget Adaptaters created by the two other plugins.</p>
          <p>The TreePlugin adds a tree inspector view to display and select the diferent graphical elements (see
number 1 in Figure 1). The BackgroundPlugin adds a specific editor for colors to display and modify the
background of selected graphical element (see number 3 in Figure 1).
4.2. Connect to the subsystems of the editor
The method #connectEditor: is used by the Pyramidion builder to link the diferent subsystems of
the domain-specific editor to the plugins (see Figure 3).</p>
          <p>The TreePlugin will have to update its content and its selection accordingly to the selection system
contents and selection. It will also have to change the selection system when the user select a new
element in the UI.</p>
          <p>The BackgroundPlugin will have to connect to the selection system to display the correct information
according to the current selection. It will have to also connect to the command executor (see Figure 5)
system to be able to modify the background of the selected graphical elements.
4.2.1. The selection system
Access to all the elements of the domain-specific model is necessary to allow the users to understand
the structure of the elements and the global properties of the model. Access to a specific subgroup
of elements of the model is also necessary to see and modify the detail of the model. Therefore, a
domain-specific editor must have 2 collections of objects:
• The first level elements, that represent all the roots of the current domain-specific model.
• The current selection, that represent a subpart of the domain-specific model.</p>
          <p>In the Figure 1 at number 1, the element named A has 3 children named B, C and D. We can see on
number 2 that the element D is selected. The first level elements is a list that contains the element A
and the current selection is a list that contains the element D.
How plugins are dynamically linked ? The first level elements and the current selection are both
observable collections. When a modification is made to one of them, a signal is sent to all the objects
that observe them. Any plugin can register as an observer of the first level elements or the current
selection.</p>
          <p>This observer/observable pattern is used by the BackgroundPlugin to update the displayed properties
panel when the current selection changes (see number 3 in Figure 1). The TreePlugin can modify the
current selection collection and therefore trigger the signal to all the observers of the current selection.
4.2.2. Object modification mechanism
We call property the association of a command and an input as depicted in the Figure 5.</p>
          <p>The input is a kind of specific editor that are used to display and modify the values of the selected
objects. In Figure 1, the element D is selected. The element D has a green background. We can see the
property for the background is present and display the green value (number 3 on the figure).</p>
          <p>The command is used to retreive the value of the properties to be displayed in the input, mutate
the selected objects (change the value of the object) and decide if the input should be visible to the
users. For example, we do not want to display the input to change the text of a graphical element if no
element in the selection is a text element.</p>
          <p>Display the value of the property. When the current selection is updated, each object of the
selection is tested by the verification method ( #canBeUsedOn) of the command of each property:
• If the verification methods return false for all selected elements, then the property is not
displayed.
• If only one method return true, then the input for this element is displayed (single selection on</p>
          <p>Figure 6).
• If multiple methods return true, then the property create multiple inputs (multi selection on</p>
          <p>Figure 6).</p>
          <p>Change the value of the property. The command is used to mutate the selected objects when the
users interact with the inputs of the properties. The input contains a callback that will use the command
on the commands executor with the new value of the input as arguments for the command (see the
method #useCommandOn of the Command Executor in the Figure 5). The commands executor can
be extended by any plugin to add behavior before or after the execution of the command.</p>
          <p>Properties Manager</p>
          <p>Property</p>
          <p>Input Builder
1 Input Model
1 Input Class</p>
          <p>Command
+ getValueOf(Objet element) → Objet
+ setValueOfWith(Objet element, Objet argument)
+ canBeUsedOn(Objet element) → Boolean</p>
          <p>Point Input Model
+ val1 → String
+ val2 → String
Point Input Class
Command Position
Command Size
1</p>
          <p>Commands Executor
before
*
+ useCCoommmmaannddOconm(mand,</p>
        </sec>
        <sec id="sec-4-1-4">
          <title>Collection current selection, *</title>
          <p>Object argument)
after
1
1</p>
          <p>Using a builder to create the inputs. The selection system allows the multi-selection of elements as
depicted in Figure 6. The property uses an input builder that creates the diferent inputs when one
element is selected or in multi-selection. The input builder take an input class and an input
model to create the inputs and their associated callbacks.</p>
          <p>Single Selection</p>
          <p>Multi Selection</p>
          <p>There are diferent types of input class: one for the strings, one for the numbers, one for the colors,
one for a boolean value, etc. Some inputs can be used in diferent context (like in the Figure 7). For
example the position property and the size property expect a Point as an argument, but this point
represents two diferent concepts. The position is a coordinate x and y on the screen, the size is a height
and a width. To specialized the Point Input we used the associated input model (Point Input
Model) to help the users to better understand what is the property they are interacting with.</p>
          <p>Constraints manager
:Properties Manager
Property Position
:Property</p>
          <p>builder
:Input Builder
command
:CommandPosition</p>
          <p>Input
:Point Input Class</p>
          <p>Model
:Point Input Model
val1 = x
val2 = y</p>
          <p>Property Size
:Property</p>
          <p>builder
:Input Builder
command
:Command Size</p>
          <p>Input
:Point Input Class</p>
          <p>Model
:Point Input Model
val1 = heigh
val2 = width</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>5. Implementation of Pyramidion</title>
      <p>We validate the Pyramidion architecture by implementing it in Pharo 3, a Smalltalk inspired language.
Smalltalk allows the modification of the model at runtime and gives the possibility to the users to see
each incremental modification. Therefore it reduces the cost of validation. Pharo is a full Integrated
Development Environment (IDE) with plenty of support tools like inspectors and debuggers The editors
created with Pyramidion can benefit from these tools.</p>
      <p>
        The plugins in Pharo To create a plugin in our implementation of Pyramidion in Pharo, we use
Traits [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. The developers create a new class that implements the trait TPyramidPlugin. The
TPyramidPlugin adds to the class the necessary methods for the Pyramidion builder. By default, the
trait has no behavior inside the methods. If the developers want their plugins to do something, they
have to override the diferent methods used by the builder.
      </p>
      <sec id="sec-5-1">
        <title>3Pharo website on: https://pharo.org/. Accessed on 25/05/2024</title>
        <p>A singleton to centralize all plugins To facilitate the creation of editors by the builder, we created
a system to register all plugins into a singleton. The singleton centralizes all the plugins and creates a
builder with all the plugins ready to be installed. Therefore, the developers only have to register their
plugins to the singleton only one time, and use the builder of the singleton to create an editor. We use
the initialization method of the meta-class of the plugins to register them automatically when the class
is created in the Pharo image. For example, we can use this behavior to automatically add new plugins
after loading the package that contains the plugins from a Git repository.</p>
        <p>
          The Spec2 library to make the UI We chose to use the Spec2 library [
          <xref ref-type="bibr" rid="ref5">5</xref>
          ] to make the UI of our
editors. Spec2 is the default UI library of Pharo. All the widgets of the Widget Adaptaters and the
panels created by the Panel Builders are created using the Spec2 library.
        </p>
      </sec>
    </sec>
    <sec id="sec-6">
      <title>6. Validation</title>
      <p>We developed a GUI builder with Pyramidion in Pharo. Some of the plugins we developed ofer
transversal capabilities and can be used in diferent domains. This is the case for:
• The serialization plugin that allows us to save the current model modifications.
• The historialization plugin keeps the state of the elements before the modification allowing the
developers to undo their modifications.</p>
      <p>• The playground plugin that creates a Pharo Playground inside the editor.</p>
      <p>We will present Pyramid, our GUI builder for Bloc in Section 6.1. We will present a selection of the
transversal plugins we created in Section 6.2.
6.1. Pyramid: a GUI builder with Pyramidion</p>
      <p>We used Pyramidion to develop Pyramid 4: a GUI builder for Pharo. Pyramid is based on Bloc, a UI
library for Pharo. Pyramid allows us to modify the properties of BlElements, the graphical elements
of Bloc. The Figure 8 shows an example of Bloc graphical elements assembled to create a 3D efect. The
dynamic graphical feedback that Pyramid enables makes developing such a complex view easier than
writing the script in a workspace, running it, and then observing the result multiple times.</p>
      <p>
        Developers can use Bloc to develop beautiful and complex applications [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. When we started the
development of Pyramid in 2023, the source code of Bloc underwent important changes. We used the
4Pyramid open source repository on: https://github.com/OpenSmock/Pyramid. Accessed on 25/05/2024
plugin-based architecture to develop Pyramid with one feature corresponding to one plugin. Therefore
when one of our features became obsolete because of the changes in the source code of Bloc, we only
had to update a single plugin.
      </p>
      <p>The default version of Pyramid is composed of 16 plugins. There are multiple plugins for the
properties, there are plugins for the WYSIWYG (What You See Is What You Get) view, etc. At Thales
DMS, we created other plugins for our specific needs. For example, we have a plugin to import designs
from Figma 5 into Pyramid.</p>
      <p>
        Generally, a GUI builder can only modify applications created with the GUI builder [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. The live
environment of Pharo allows us to modify the UI of any Bloc applications in real time and not only
applications created with Pyramid. For example, users could be interacting with a UI developed in Bloc.
While interacting with the UI, users change the current state of the application. We can use Pyramid to
stop the user interactions and open the current UI inside Pyramid. Pyramid can be used to modify the
UI while keeping the state of the application. When Pyramid is closed, we allow users to interact with
the UI again. The UI will retain the modifications made with Pyramid.
6.2. Transversal plugins
We developed multiple transversal plugins that can be used in diferent domain-specific editors.
Currently, the transversal plugins are used by Pyramid. We will see the serialization plugin, the
historialization plugin, and the playground plugin.
      </p>
      <p>The serialization plugin The serialization allows the users to save their current modifications. The
serialization plugin will use the first level elements of the selection system as an entry point to generate
a string that can be used to recreate similar objects. We chose to use Ston [6, Chapter 9] as the support
for the serialization.</p>
      <p>
        The historialization plugin The historialization is important because it is one of the most used
commands in other IDE [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ]. The historialization plugin extends the command executor to add
behavior before and after the execution of the commands. The plugin will create a memento of the state
of the objects before the execution of the command and afterward. The mementos are used to restore
the state of the objects.
      </p>
      <p>The playground plugin The playground allows to add a Pharo playground in any domain-specific
editor. The playground of Pharo allows to send any message to any object. It is a possible entry point to
connect any tools of Pharo to the domain-specific model. It can also be used to modify any properties
that are not already developed in the domain-specific editor.</p>
    </sec>
    <sec id="sec-7">
      <title>7. Related works</title>
      <p>
        Domain-specific tools Moldable debugger [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] proposes a domain-specific framework for debugger.
The moldable debugger allows developers to create domain-specific extensions to their debuggers to
resolve domain-specific problems. Pyramidion can be used to understand, modify, and create a new
domain-specific model. The debugging capability of Pyramidion is limited but Pyramidion can be used
with the other tools available in Pharo, like the debugger. The moldable debugger can move seamlessly
from one domain to another thanks to its user interface and its activation predicate for domain-specific
tasks, our approach can also adapt its UI for diferent domain properties.
      </p>
      <p>
        The Eclipse platform 6 allows the integration of domain-specific tools. The Eclipse platform developer
chooses which tools are installed. With Pyramidion, the developer also chooses which plugins are
installed. The Eclipse platform ofers diferent levels of integration [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]. Some tools will interact with
5Figma website on: https://www.figma.com/. Accessed on 25/05/2024
6Eclipse website: https://eclipseide.org/. Accessed on 10/08/2024
the Eclipse platform through data sharing. Others will ofer dedicated API. Finally, some can modify
the UI of the Eclipse IDE, respond to a change in the selection, and even respond to an event created by
other tools. Pyramidion has only one level of integration, corresponding to the UI integration.
GUI builders Citrus [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] is a language and a framework used to create a graphical editor for structured
data and code. Pyramidion can also modify structured data but currently, it has not been tested to
modify code. Citrus can be used to define models and behaviors of applications. We would like Pyramid
to do the same soon. Our implementation of Pyramidion does not define a new language but uses an
already specified one, the Pharo language.
      </p>
      <p>
        Amulet [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] is a development environment to create GUI. Like Pyramidion, Amulet allows the
modifications of graphical objects at runtime. Unlike Pyramid, Amulet also allows the modifications of
the behaviors of the application. Amulet provides the developer debugging tools: an inspector and a
debugger. In Pyramid, we created plugins to access the already present debugging tools inside the Pharo
environment. In Pyramid, we have access to the Pharo inspector and the Pharo playground. From the
inspector, we can set breakpoints and object-centric breakpoints 7.
      </p>
    </sec>
    <sec id="sec-8">
      <title>8. Conclusion and Future Works</title>
      <p>We developed Pyramidion, a plugin-based framework that allows developers to create their
domainspecific editors. The plugin-based architecture simplifies the development process and permits the
reuse of some of the defined behavior between really diferent domains. We then used Pyramidion to
create Pyramid, a GUI builder in Pharo.</p>
      <p>As discussed in the previous sections, Pyramid cannot modify the behavior of the user interface and
dynamic widgets. But thanks to the Pyramidion framework, it will be easier to add new functionality
to Pyramid. This would allow Pyramid to create or modify complete applications at runtime with a
dedicated UI, allowing us to prototype more quickly.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>P.</given-names>
            <surname>Laborde</surname>
          </string-name>
          , É. Le Pors,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Le Gof</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Plantec</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Costiou</surname>
          </string-name>
          ,
          <article-title>Ergonomic evaluations of human-machine interfaces in the defense business: an example of a collaborative maritime surveillance system</article-title>
          ,
          <year>2024</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>D. C.</given-names>
            <surname>Littman</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Pinto</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Letovsky</surname>
          </string-name>
          , E. Soloway,
          <article-title>Mental models and software maintenance</article-title>
          ,
          <source>Journal of Systems and Software</source>
          <volume>7</volume>
          (
          <year>1987</year>
          )
          <fpage>341</fpage>
          -
          <lpage>355</lpage>
          . URL: https://linkinghub.elsevier.com/retrieve/pii/ 0164121287900331. doi:
          <volume>10</volume>
          .1016/
          <fpage>0164</fpage>
          -
          <lpage>1212</lpage>
          (
          <issue>87</issue>
          )
          <fpage>90033</fpage>
          -
          <lpage>1</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>A.</given-names>
            <surname>Ply</surname>
          </string-name>
          ,
          <article-title>Software development in ada and motif using a gui builder</article-title>
          , volume
          <volume>2</volume>
          ,
          <year>1996</year>
          , pp.
          <fpage>505</fpage>
          -
          <lpage>510</lpage>
          vol.
          <volume>2</volume>
          . doi:
          <volume>10</volume>
          .1109/NAECON.
          <year>1996</year>
          .
          <volume>517696</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>S.</given-names>
            <surname>Ducasse</surname>
          </string-name>
          ,
          <string-name>
            <given-names>O.</given-names>
            <surname>Nierstrasz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Schärli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Wuyts</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A. P.</given-names>
            <surname>Black</surname>
          </string-name>
          ,
          <article-title>Traits: A mechanism for fine-grained reuse</article-title>
          ,
          <source>ACM Transactions on Programming Languages and Systems</source>
          <volume>28</volume>
          (
          <year>2006</year>
          )
          <fpage>331</fpage>
          -
          <lpage>388</lpage>
          . URL: https://dl.acm.org/doi/10.1145/1119479.1119483. doi:
          <volume>10</volume>
          .1145/1119479.1119483.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>J.</given-names>
            <surname>Fabry</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ducasse</surname>
          </string-name>
          ,
          <article-title>The Spec UI framework</article-title>
          , Square Bracket Associates, [Kehrsatz] Switzerland,
          <year>2017</year>
          . OCLC:
          <volume>1021885954</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>D.</given-names>
            <surname>Cassou</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ducasse</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Fabresse</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Fabry</surname>
          </string-name>
          ,
          <string-name>
            <surname>S. Van Caekenbergh</surname>
          </string-name>
          ,
          <source>Enterprise Pharo a Web Perspective</source>
          , Square Bracket Associates,
          <source>Place of publication not identified</source>
          ,
          <year>2016</year>
          . OCLC:
          <volume>1151080859</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>G.</given-names>
            <surname>Murphy</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Kersten</surname>
          </string-name>
          , L. Findlater,
          <article-title>How are Java software developers using the Eclipse IDE?</article-title>
          ,
          <source>IEEE Software 23</source>
          (
          <year>2006</year>
          )
          <fpage>76</fpage>
          -
          <lpage>83</lpage>
          . URL: https://ieeexplore.ieee.org/document/1657944/. doi:
          <volume>10</volume>
          .1109/ MS.
          <year>2006</year>
          .
          <volume>105</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>A.</given-names>
            <surname>Chiş</surname>
          </string-name>
          ,
          <string-name>
            <given-names>T.</given-names>
            <surname>Gîrba</surname>
          </string-name>
          ,
          <string-name>
            <surname>O. Nierstrasz,</surname>
          </string-name>
          <article-title>The Moldable Debugger: A Framework for Developing DomainSpecific Debuggers</article-title>
          , in: B.
          <string-name>
            <surname>Combemale</surname>
            ,
            <given-names>D. J.</given-names>
          </string-name>
          <string-name>
            <surname>Pearce</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          <string-name>
            <surname>Barais</surname>
            ,
            <given-names>J. J.</given-names>
          </string-name>
          <string-name>
            <surname>Vinju</surname>
          </string-name>
          (Eds.),
          <string-name>
            <surname>Software Language</surname>
          </string-name>
          7Object-centric debugging on Pharo: https://thepharo.dev/2020/07/16/object-centric
          <article-title>-breakpoints-a-tutorial/</article-title>
          . Accessed on
          <volume>10</volume>
          /08/2024 Engineering, volume
          <volume>8706</volume>
          , Springer International Publishing, Cham,
          <year>2014</year>
          , pp.
          <fpage>102</fpage>
          -
          <lpage>121</lpage>
          . URL: http://link.springer.com/10.1007/978-3-
          <fpage>319</fpage>
          -11245-
          <issue>9</issue>
          _6. doi:
          <volume>10</volume>
          .1007/978-3-
          <fpage>319</fpage>
          -11245-
          <issue>9</issue>
          _6,
          <string-name>
            <surname>series</surname>
            <given-names>Title</given-names>
          </string-name>
          : Lecture Notes in Computer Science.
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>J.</given-names>
            <surname>Amsden</surname>
          </string-name>
          ,
          <article-title>Levels of integration: Five ways you can integrate with the eclipse platform (</article-title>
          <year>2001</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>A. J.</given-names>
            <surname>Ko</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B. A.</given-names>
            <surname>Myers</surname>
          </string-name>
          ,
          <article-title>Citrus: a language and toolkit for simplifying the creation of structured editors for code and data, in: Proceedings of the 18th annual ACM symposium on User interface software and technology</article-title>
          , ACM, Seattle WA USA,
          <year>2005</year>
          , pp.
          <fpage>3</fpage>
          -
          <lpage>12</lpage>
          . URL: https://dl.acm.org/doi/10.1145/ 1095034.1095037. doi:
          <volume>10</volume>
          .1145/1095034.1095037.
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>B.</given-names>
            <surname>Myers</surname>
          </string-name>
          ,
          <string-name>
            <surname>R. McDaniel</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Miller</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Ferrency</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Faulring</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.</given-names>
            <surname>Kyle</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Mickish</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Klimovitski</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Doane</surname>
          </string-name>
          ,
          <article-title>The Amulet environment: new models for efective user interface software development</article-title>
          ,
          <source>IEEE Transactions on Software Engineering</source>
          <volume>23</volume>
          (
          <year>1997</year>
          )
          <fpage>347</fpage>
          -
          <lpage>365</lpage>
          . URL: http://ieeexplore.ieee.org/ document/601073/. doi:
          <volume>10</volume>
          .1109/32.601073.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>