Clprolf is a language and framework that helps you design objects with a single, explicit responsibility. By assigning each class a role (also called its declension), you ensure compliance with the Single Responsibility Principle (SRP). Objects become components, and this clarity remains intact even with inheritance.
A declension expresses the nature of a class — its fundamental role in the system. Clprolf defines only a few basic roles, which keeps design unambiguous and intuitive.
The five available declensions are:
agent
Synonyms: abstraction
, simu_real_obj
.
worker_agent
Synonyms: comp_as_worker
.
model
(no synonyms).
information
(no synonyms).
indef_obj
A flexible object without explicit role, behaving like a traditional OO class.
Each declension keeps only a minimal set of synonyms, and every synonym reflects a specific aspect:
agent
(agent aspect), abstraction
(object aspect), simu_real_obj
(simulation aspect)worker_agent
(agent aspect), comp_as_worker
(simulation aspect)model
information
indef_obj
This structure makes the system both easy to memorize and easy to teach. Synonyms are no longer arbitrary alternatives but clearly justified by the perspective they express.
These objects represent real-world abstractions or domain concepts.
agent
: the active actor.
agent
emphasizes action.simu_real_obj
emphasizes simulation.abstraction
emphasizes conceptual encapsulation (e.g., a Connection
, a Socket
).abstraction
: for abstract concepts and system elements (connections, sockets, system utilities).
simu_real_obj
: a micro-simulation of a real-world entity.
Example: a Giraffe
class with states and behaviors simulating how a giraffe acts.
model
: a passive entity with no behavior — just attributes.
Example: a Customer
with fields but no methods.
These objects handle purely computational or support tasks. Here, the computer itself is seen as the actor.
worker_agent
: the computer as a worker executing algorithms.
Synonyms: comp_as_worker
.
information
: a coherent data container, used by workers in algorithms.
⚠️ Unlike model
, it does not represent a real-world entity, only technical data.
Examples: system utilities, DAOs, repositories, low-level services, or MVC view components.
Declensions can be refined with genders (optional sub-roles). They may also have synonyms:
@Expert_component
= @Human_expert
@Active_agent
(no synonym)@Static
= @Expert_component_static
= @Human_expert_static
@Static
for worker_agent
(no synonym)⚠️ Genders apply only to agents, except @Static
, which may also apply to worker_agent.
Agents and Workers Every agent can also act as a worker (computers execute agents as workers). But explicit workers should be minimized for clarity.
Models and Information A model can be represented as information (stored as data), but information should not replace a model.
Unidirectional Substitutions
These reversals usually reveal a design flaw or a deliberate reinterpretation.
Interfaces also have declensions:
compat_interf_version
= version_inh
compat_interf_capacity
= capacity_inh
compat_interf
(no synonym)Declensions on interfaces specify which classes are allowed to implement them.
Capacity interfaces can also have a gender called Advice:
@For_agent_like
@For_worker_like
Clprolf enforces that inheritance stays role-consistent:
@Forced_inh
.In pure Clprolf, the declension replaces the class
keyword.
In the framework, it appears as an annotation above the class.
Example:
@Agent
public class Animal { ... }
Every class must declare a role.
Step 1 – Does the class have methods?
@Agent
or @Worker_agent
.@Model
(entity) or @Information
(technical container).Step 2 – Is the responsibility business-related or technical?
@Agent
.@Worker_agent
.At first sight: @Worker_agent
(low-level, technical).
But Clprolf favors @Agent
whenever possible.
System could also be seen as:
@Abstraction
— since “the system” is a conceptual entity.@Agent(Gender.EXPERT_COMPONENT)
— as an expert component representing the environment.Result: a simpler, more maintainable system, where every object is clearly positioned.
If the class already fits one of the well-known architectural categories, you can directly assign a matching role:
@Agent
@Agent
or @Worker_agent
(often with Gender.STATIC
)@Worker_agent
@Agent