Fact-checked by Grok 2 weeks ago

Metaobject

In , a metaobject is an object that represents elements of a , such as classes or methods, operating at a higher level of to describe, create, manipulate, or implement other objects rather than domain-specific entities. This concept enables , where the system can inspect and modify its own structure and behavior during execution. The notion of metaobjects gained prominence through the development of metaobject protocols (), which define protocols for interacting with these entities to customize language semantics and implementation details. In the Object System (CLOS), metaobjects form the foundation of the , allowing programmers to subclass standard classes like standard-class and override generic functions to alter , method dispatch, and instance creation while maintaining compatibility with the base language. This approach, formalized in the early 1990s, balances extensibility with efficiency, enabling experimentation with object-oriented paradigms without requiring changes to the core language. Metaobjects appear in various programming languages beyond , often through mechanisms like metaclasses that serve similar reflective purposes. In , metaclasses—such as the built-in type—control class creation by defining how class objects are instantiated, prepared, and initialized, allowing customization via special methods like __new__ and __prepare__. This facility supports advanced techniques, including automatic attribute validation, patterns, and implementations. Overall, metaobjects underscore the introspective power of modern object-oriented systems, influencing designs in languages like Smalltalk and while promoting portable and modular extensions.

Definition and Concepts

Core Definition

A metaobject is an object whose primary purpose is to represent, manipulate, create, or describe other objects, known as base objects, with a on their structural aspects such as , methods, attributes, and interfaces. In object-oriented systems, metaobjects serve as the foundational entities for , enabling the programmatic inspection and alteration of the object's representation rather than its direct domain functionality. Key characteristics of metaobjects include their support for , which allows examination of the structure and properties of base objects, and , which permits modification of their behavior at or compile time. For instance, a metaobject might expose details like a class's superclasses or slots for , or intervene in method dispatch to customize execution. These capabilities form the basis for , where metaobjects enable a program to reason about and adapt its own structure. The recursive nature of metaobjects arises because they themselves are objects that can be represented by higher-level metaobjects, forming meta-level hierarchies that extend the reflective depth of the system. This self-referential structure allows metaobjects to be introspected and interceded upon in the same manner as base objects, creating a uniform model across levels. In contrast to base objects, which encapsulate and perform domain-specific tasks such as modeling real-world entities like a or a , metaobjects operate exclusively on the representation and mechanics of those base objects, residing at a meta-level concerned with the program's own architecture. This distinction ensures that metaobjects do not interfere with the primary logic of the application but instead provide tools for its customization and extension.

Relation to Reflection

Reflection in programming refers to the ability of a system to examine and modify its own structure and behavior at runtime, with metaobjects providing the foundational mechanism for this self-referential capability by representing and manipulating program elements such as classes and methods. Metaobjects enable two primary types of reflection: structural reflection, which allows inspection of program components like class hierarchies and method definitions, and behavioral reflection, which permits alteration of execution dynamics, such as customizing method dispatch or interceding in message passing. These reflective capabilities offered by metaobjects support dynamic languages by allowing deep customization of language behavior, facilitate architectures through frameworks like object-relational mappers that dynamically adapt object behavior, and enable adaptive systems via evolution, such as adding methods or modifying . However, metaobject-based introduces limitations, including increased complexity that demands profound understanding of language internals, potential security risks such as data leakage attacks exploiting metaobjects to access sensitive information, and performance overhead from dynamic modifications that can slow efficiency compared to static operations.

Historical Development

Origins in Smalltalk

Metaobjects first emerged during the 1970s and 1980s at as part of the programming environment, where the innovative class-based object system positioned classes themselves as metaobjects responsible for defining the properties and behaviors of their instances. This design treated classes not merely as blueprints but as first-class objects that could be inspected, modified, and extended, embodying a uniform model where everything in the system—from primitive data to complex structures—was an object. The conceptualization was driven by and the Smalltalk development team at PARC, who drew inspiration from biological and physical models to view objects as active entities simulating aspects of reality, such as communication through messages and self-contained state management. Kay's vision emphasized personal computing as an interactive medium for learning and creation, with Smalltalk's object-oriented paradigm enabling users to build and evolve systems incrementally, much like composing models of the world. This philosophical foundation underscored the role of metaobjects in providing a layered that mirrored real-world hierarchies while allowing seamless manipulation. Key early features of Smalltalk's metaobject system included runtime dynamic class modification and method addition, which permitted developers to alter object behaviors without restarting the environment, fostering a highly interactive and adaptive programming experience. For instance, metaclasses in Smalltalk-80 explicitly represented definitions as objects, enabling reflective operations like subclassing or overriding at execution time, which were essential for prototyping and in real-time. These capabilities, rooted in the system's reflective kernel, allowed objects to introspect and reconfigure their own meta-level structures, setting a precedent for extensibility beyond static compilation. Smalltalk's reflective model, by showcasing metaobjects as enablers of system openness and customization, profoundly influenced later reflective architectures, including those in dialects that built upon its metaclasses and dynamic features.

Evolution in Lisp and Beyond

The metaobject concepts originating in Smalltalk's reflective model were adapted and advanced within dialects during the 1980s, particularly through early object systems like Flavors and LOOPS that laid groundwork for extensible behavior. This evolution culminated in the integration of metaobjects into the Object System (CLOS) in the late 1980s, where they were formalized as a foundational mechanism to enable , generic functions, and customizable dispatch. CLOS, developed through collaborative efforts including contributions from PARC researchers, treated classes, methods, and generic functions themselves as instances of metaobjects, allowing programmers to introspect and modify the object system's behavior at runtime. A key milestone came with the 1991 publication of The Art of the Metaobject Protocol by , Jim des Rivieres, and Daniel G. Bobrow, which detailed an explicit metaobject protocol () for CLOS, emphasizing its design as a reflective layer that could be extended without altering the core language. This work formalized the MOP as a set of generic functions operating on metaobjects, providing a blueprint for open implementations of object-oriented systems. The MOP's principles exerted broad influence on subsequent programming paradigms, notably inspiring (AOP) in the , where Kiczales and colleagues leveraged metaobject-like interception for modular crosscutting concerns. By the , these ideas permeated dynamic languages and static ones alike, with manifestations in Java's dynamic proxies that enabled runtime interception akin to metaobject mediation. Early MOP designs, however, primarily emphasized runtime reflection, with compile-time extensions emerging later in the through systems like OpenC++, which introduced metaobject protocols tailored for C++ compilation phases.

Metaobject Protocols

Overview of MOP

A metaobject protocol (MOP) is an interface that allows programmatic access and modification to the internals of an object system, enabling developers to customize aspects such as class creation, definition, and structures. In the context of the Object System (CLOS), the MOP describes the object system itself as an extensible program written in CLOS, where metaobjects adhere to a set of protocols to define standard behaviors. This design provides a standardized way to manipulate the meta-level of objects, distinguishing it from simpler reflective mechanisms by offering fine-grained control over the system's foundational operations. The core components of a MOP include metaobjects, which are first-class objects that reify elements of the object system such as classes, methods, and generic functions. Metaclasses serve as the classes of these metaobjects, defining their structure and behavior—for instance, the standard-class metaclass governs typical class instances. Generic functions act as metaoperations, allowing dispatch on metaobjects to perform tasks like computing class precedence lists or method combinations, thereby integrating the meta-level seamlessly with the base level. MOPs operate on principles that intentionally diverge from traditional software engineering tenets for greater flexibility, such as violating the open-closed by exposing and allowing modification of the "closed" implementation details through principled access points like , , and . To prevent in this meta-level manipulation, the protocol applies recursively: metaobjects are themselves instances of the object system, bounded by the same rules without requiring additional layers. Among its advantages, a MOP facilitates the of domain-specific languages (DSLs) by enabling tailored syntax and semantics through meta-level extensions, such as for internal DSLs. It also supports deep system customization without altering the core language or object system code, promoting reusability, maintainability, and the development of portable, high-performance applications. This extensibility has roots in the CLOS design, where the MOP emerged as a for .

Runtime and Compile-Time Aspects

Metaobject protocols (MOPs) operate distinctly at runtime and compile-time, influencing the flexibility and performance of reflective programming systems. Runtime MOPs facilitate dynamic alterations to program structure and behavior during execution, such as adding methods to classes or modifying inheritance hierarchies on the fly. This capability is central to interpreted languages like Common Lisp, where the Common Lisp Object System (CLOS) MOP enables hot-swapping of code and adaptive behaviors without restarting the application, supporting features like live updates in development environments. In contrast, compile-time MOPs focus on static transformations during the build phase, analyzing and generating code based on metaobjects to optimize execution. For instance, OpenC++ provides a compile-time MOP for C++ that allows programmers to customize class definitions and method implementations before runtime, eliminating dynamic dispatch overhead but confining changes to pre-execution decisions. This approach excels in compiled languages by enabling optimizations like inlining or static type checking, though it inherently limits post-compilation modifications. Challenges arise in integrating these aspects, particularly in non-runtime environments where pure dynamism is unavailable, necessitating approaches that use compile-time to insert minimal hooks. Such strategies precompute meta-level data during compilation while preserving some execution-time adaptability, as demonstrated in fault-tolerant CORBA applications via OpenC++-based . Additionally, interactions between meta-meta levels can complicate control, potentially leading to infinite or unstable metalevel architectures if the distinction between base and meta operations is not rigorously maintained. In the , systems like SWCLOS (introduced in 2006) leverage the CLOS to realize OWL-Full semantics dynamically, integrating RDF and OWL models with object-oriented for ontology-based reasoning and evolution.

Key Features and Usage

Metaobject protocols () provide several essential features that enable fine-grained control over object-oriented behavior. One core feature is method combination, which allows developers to define how multiple methods applicable to a are integrated during invocation, such as through before, after, and around methods that execute preparatory, concluding, or wrapping logic respectively. Another key aspect is access , where the protocol exposes for reading and writing instance slots, permitting such as validation, , or redirection to . Additionally, inheritance linearization is handled via mechanisms like class precedence list computation, which determines the order of superclass resolution to resolve ambiguities in hierarchies. In practice, are used to extend object systems for specialized needs like , where slot access s can serialize object state to databases transparently; , by intercepting dispatch to enforce access policies; or optimization, through custom caching in invocation. A representative usage pattern involves customizing dispatch in , for instance, by subclassing the generic-function metaobject to alter selection based on conditions like or performance heuristics, thereby adapting the object system without altering core language semantics. Best practices for MOP usage emphasize balancing the 's expressive power with system stability, such as limiting metacircular modifications to avoid infinite recursion or unintended interference with standard object operations, and custom meta-behaviors to ensure they do not degrade runtime performance. Early developed before the , such as the original CLOS , were primarily designed for single-threaded execution and lacked built-in integration with concurrency paradigms, potentially leading to race conditions in shared metaobjects.

Implementations in Programming Languages

In Common Lisp (CLOS)

In the Common Lisp Object System (CLOS), classes are first-class objects that serve as instances of metaclasses, enabling and of the object model itself. The default metaclass is standard-class, which inherits from standard-object and provides the foundational behavior for user-defined classes. Methods in CLOS are also metaobjects, specifically instances of the standard-method class, and are associated with generic functions—instances of standard-generic-function—which handle dispatch based on argument types via mechanisms. Key mechanisms in CLOS include support for , managed through the generic function compute-class-precedence-list, which linearizes superclasses according to the algorithm to resolve conflicts and establish an ordered class precedence list for selection and . Slot definitions occur within defclass forms, where options such as :initarg specify keywords for passing initial values during instance creation via make-instance, and :accessor generates s for reading and writing values, ensuring type-safe and extensible access. The CLOS metaobject protocol, including these structures and mechanisms, laid the groundwork for the seminal 1991 book The Art of the Metaobject Protocol by , Jim des Rivières, and Daniel G. Bobrow, which formalized the reflective extensions to the ANSI standard. As of 2025, CLOS continues to support advancements in and symbolic , particularly through libraries like MGL for integration and its role in neuro-symbolic systems requiring dynamic object manipulation.

In Python and Ruby

In , metaclasses provide a mechanism for customizing class creation, where classes themselves are instances of a metaclass, with the built-in type serving as the default metaclass. This allows developers to intercept and modify the class definition process, such as by overriding methods like __new__ or __init__ in a custom metaclass to enforce validation or add behaviors dynamically. For instance, the type() function enables runtime class creation, as in MyClass = type('MyClass', (Base,), {'attr': value}), which constructs a with specified bases and attributes. A prominent example is the ABCMeta metaclass used in the abc module to define abstract base classes, ensuring subclasses implement required methods via abstractmethod decorators. Since the 2010s, 's metaclass system has seen enhancements in versions 3.10 and later, particularly through improved error messages that aid during and metaclass conflicts, making it easier to diagnose issues like incompatible resolutions. These updates build on the foundational metaclass syntax introduced in Python 3.0 via PEP 3115, promoting more robust dynamic class manipulation without altering core semantics. In , metaclasses—often referred to as eigenclasses or classes—allow attaching s to individual objects or es at runtime, enabling fine-grained customization without affecting other instances. The eigenclass of an object is accessed via class << obj; end, where s defined inside apply only to obj, such as adding a for unique behavior. Additionally, Module#define_method facilitates dynamic definition, accepting a symbol or string for the method name and a or as its body, which is commonly used for to extend es conditionally. Ruby's metaprogramming leverages these features extensively for domain-specific languages (DSLs), as seen in , where constructs like has_many in ActiveRecord models dynamically generate association methods and queries. In Ruby 3.0 and subsequent releases, overall interpreter optimizations like MJIT improve execution speed for dynamic operations, with further enhancements including YJIT in Ruby 3.1 and later.

Applications and Examples

In Aspect-Oriented Programming

In (AOP), metaobjects facilitate the modular handling of cross-cutting concerns by enabling the and modification of invocations at or , thereby separating ancillary behaviors from core logic without invasive changes to the base code. This integration leverages metaobject protocols (MOPs) to define interception points, where aspects act as metaobjects that dynamically alter program execution semantics. For instance, around in AOP frameworks intercepts calls by wrapping them with additional logic, akin to proxy-based mechanisms in that emulate MOP functionality. Central to this approach are key concepts such as aspects, which function as metaobjects to weave behaviors like , checks, or transaction management into existing codebases transparently. These aspects operate at a meta-level, inspecting and augmenting join points—well-defined execution points in the program—without requiring modifications to the original classes. This preserves the integrity of object-oriented structures while promoting reusability and maintainability for concerns that span multiple modules. Representative examples illustrate this meta-level access effectively. In , pointcuts define predicates to select join points, such as executions, enabling aspects to inject that manipulates these points via reflective introspection similar to a . Similarly, extensions to the Object System (CLOS), such as AspectL, utilize the CLOS to implement AOP features, allowing dynamic scoping of functions to override behaviors for cross-cutting concerns like tracing or . Advancements in the post-2000 era have integrated metaobjects more deeply into AOP frameworks for enterprise applications. Spring AOP, introduced around , employs proxy-based metaobjects—using JDK dynamic proxies or CGLIB—to enable runtime weaving of aspects, which addresses the limitations of AspectJ's static compile-time weaving by supporting dynamic, annotation-driven configurations in large-scale systems. This proxy mechanism, functioning as a lightweight MOP equivalent, has facilitated widespread adoption in transaction management and caching scenarios within Spring-based ecosystems.

In Software Engineering Tools

In (CASE) tools, metaobjects serve as foundational elements for representing and manipulating UML models, facilitating automated and model-driven development. For instance, the Modeling Framework () employs metaobjects within its Ecore metamodel to define structural models, enabling the generation of code, editors, and runtime support for domain-specific applications. Metaobjects play a crucial role in languages (DSMs), where they define metamodels that allow customization of modeling notations and behaviors tailored to particular application domains. By specifying abstract syntax, semantics, and constraints through metaobjects, DSMs enable domain experts to create models that directly map to executable code or configurations, improving productivity in specialized fields like embedded systems or multimedia processing. Key examples include the Meta-Object Facility (MOF), an standard integral to UML for repository management, which uses metaobjects to store, export, and import models in a platform-independent manner, supporting metadata-driven . In persistence layers, such as Hibernate for object-relational mapping (), metaobjects underpin the metamodel to manage entity mappings, queries, and runtime persistence contexts between object-oriented applications and relational databases. In the 2020s, metaobjects have seen integration into low-code platforms like , where metamodel annotations enable type-safe templating and rapid application generation. These platforms support enterprise-grade development at scale, including AI-assisted features as of 2025.

References

  1. [1]
    [PDF] The Art of the Metaobject Protocol Gregor Kiczales, Jim des Rivieres ...
    In the CLOS metaobject protocol, for example, the rules used to determine the implementation of instances are controlled by a small number of generic functions.
  2. [2]
    [PDF] Metaobject protocols: Why we want them and what else they can do
    Metaobject protocols: Why we want them and what else they can do. Gregor Kiczales, J.Michael Ashley, Luis Rodriguez, Amin Vahdat, and Daniel G. Bobrow.<|control11|><|separator|>
  3. [3]
    18 The Metaobject Protocol - LispWorks
    18 The Metaobject Protocol. LispWorks CLOS essentially supports the metaobject protocol described in chapters 5 & 6 of The Art of the Metaobject Protocol ...
  4. [4]
  5. [5]
    [PDF] Mirrors: Design Principles for Meta-level Facilities of Object-Oriented ...
    In a mirror based design, one moves from the base level to the meta levels by means of a reflect operation. The levels are clearly separated.
  6. [6]
    Exploiting Metaobjects to Reinforce Data Leakage Attacks
    We disclose that metaobjects, a general and crucial aspect of reflective programming, could be exploited for efficient data leakage attacks. We design an ...
  7. [7]
    The Early History Of Smalltalk
    This Smalltalk language (today labeled -71) was very influenced by FLEX, PLANNER, LOGO, META II, and my own derivatives from them. It was a kind of parser with ...
  8. [8]
    The early history of Smalltalk | ACM SIGPLAN Notices
    Early Smalltalk was the first complete realization of these new points of view as parented by its many predecessors in hardware, language and user interface ...
  9. [9]
    Reflective facilities in Smalltalk-80 - ACM Digital Library
    Computational reflection makes it easy to solve problems that are otherwise difficult to address in Smalltalk-80, such as the construction of monitors, ...Missing: metaobjects | Show results with:metaobjects
  10. [10]
    Programming with explicit metaclasses in Smalltalk-80
    This paper discusses the introduction of explicit metaclasses á la ObjVlisp into the Smalltalk-80 language. The rigidity of Smalltalk metaclass architecture ...
  11. [11]
    [PDF] A Review of The Art of the Metaobject Protocol - Dreamsongs
    Mar 3, 2010 · The Xerox group brought the background understanding of the generic function model and an appreciation for—and the deepest un- derstanding of— ...
  12. [12]
    [PDF] Evolution of Common Lisp Object System
    Feb 1, 2023 · The object system was added to Common Lisp in 1986. The first extension, Flavors, was for MACLISP in 1979, focusing on message passing.
  13. [13]
    Common Lisp Object System specification | ACM SIGPLAN Notices
    The chapter "The Common Lisp Object System Meta-Object Protocol" describes how the Common Lisp Object System can be customized. The fundamental objects of ...
  14. [14]
    [PDF] The Common Lisp Object System: An Overview - Dreamsongs
    The Common Lisp Object System is implemented in terms of a set of objects that correspond to predefined classes of the system. These objects are termed meta- ...
  15. [15]
    The Art of the Metaobject Protocol - MIT Press
    The Art of the Metaobject Protocol. by Gregor Kiczales, Jim des Rivieres and Daniel G. Bobrow. Hardcover. Out of print. Hardcover.
  16. [16]
    [PDF] Aspect Oriented Programming - UBC Computer Science
    When prototyping AOP systems we often start by developing simple metaobject protocols for the component language, and then prototype imperative aspect programs ...
  17. [17]
    [PDF] Design Principles for Robust Object-oriented Intercession APIs
    Abstract. Proxies are a powerful approach to implement meta-objects in object-oriented languages without having to resort to metacircular interpretation.
  18. [18]
    MOP: Concepts
    MOP is a metaobject protocol for CLOS, describing CLOS as an extensible program. Metaobjects represent program elements, and their behavior provides the CLOS ...Missing: core components
  19. [19]
    [PDF] Open Implementations and Metaobject Protocols - CL-PDX
    Sep 8, 1996 · Notes from an earlier tutorial that shows how to use OO programming techniques to support Open. Implementation of programming languages. Many of ...<|control11|><|separator|>
  20. [20]
    [PDF] Builders - How MOPs Make Life Easy - ACCU
    Introduce metaobject protocols (MOPs):. – What they are, and why they are useful. ○. Introduce domain specific languages (DSLs):. – Internal, and external.<|separator|>
  21. [21]
    The Meta-Object Protocol and Knowledge-Based Systems - Franz Inc.
    The Meta-Object Protocol (MOP) is a protocol layer in Common Lisp which contains a set of default rules about how the CLOS object system works.
  22. [22]
  23. [23]
    OWL-Full Reasoning from an Object Oriented Perspective
    OWL-Full Reasoning from an Object Oriented Perspective · Abstract · Chapter PDF · References · Author information · Editor information · Rights and permissions.
  24. [24]
    Book Details
    Insufficient relevant content. The provided content only includes book details and an iframe from MIT Press, with a "Book not found" message. No information is available about the metaobject protocol, method combination, slot access, inheritance linearization, or extending object systems.
  25. [25]
    [PDF] Expanding JavaScript's metaobject protocol - SJSU ScholarWorks
    Metaobject protocols have numerous applications, including persistence [2,3], pre/post conditions [4], tool support [5], and security [6], among others.Missing: optimization | Show results with:optimization
  26. [26]
    A Multi-Level Meta-Object Protocol for Fault-Tolerance in Complex ...
    In this paper, we present a generic framework that addresses this problem and can be used within current industrial software. Our proposal is based on a limited ...
  27. [27]
    The Common Lisp Cookbook – Fundamentals of CLOS
    it is provided by a meta-object protocol, which provides a standard interface to the CLOS, and can be used to create new object systems. The functionality ...
  28. [28]
    17. Object Reorientation: Classes - gigamonkeys
    Object Reorientation: Classes. If generic functions are the verbs of the object system, classes are the nouns. As I mentioned in the previous chapter, ...Object Initialization · Accessor Functions · Multiple Inheritance
  29. [29]
    Top 8 AI programming languages you should use in 2025 | DECODE
    Aug 22, 2025 · mgl – A machine learning library for Common Lisp, supporting neural networks and deep learning. Antik & GSLL – Numerical libraries that provide ...
  30. [30]
  31. [31]
  32. [32]
    abc — Abstract Base Classes — Python 3.14.0 documentation
    Metaclass for defining Abstract Base Classes (ABCs). Use this metaclass to create an ABC. An ABC can be subclassed directly, and then acts as a mix-in class.
  33. [33]
  34. [34]
  35. [35]
    Ruby 3.0.0 Released
    Dec 25, 2020 · We are pleased to announce the release of Ruby 3.0.0. From 2015 we developed hard toward Ruby 3, whose goal is performance, concurrency, and Typing.
  36. [36]
    Aspect-Oriented Programming Using Reflection and Metaobject ...
    Oct 1, 2001 · A metaobject protocol (MOP) defines execution of an application in terms of behaviors implemented by metaclasses (examples include Class or ...Missing: compile- | Show results with:compile-
  37. [37]
    [PDF] Aspect-Oriented Programming using Reflection and Metaobject ...
    Apr 27, 2001 · In the remainder of this article, we give a brief overview of reflection and metaobject protocols, show how they are excellent tools for aspect ...Missing: influence | Show results with:influence
  38. [38]
    [PDF] An Overview of AspectJ
    CommonLoops and 3-KRS proposed different meta-level architectures for OO languages [3] PCL provided the first efficient metaobject-protocol [25]. Much of ...
  39. [39]
    [PDF] A Short Overview of AspectL - Pascal Costanza
    Aug 21, 2004 · AspectL adds a number of features to the Common Lisp Object System (CLOS) that have been developed in the recent years in the AOSD community ...
  40. [40]
    AOP Proxies :: Spring Framework
    Spring AOP defaults to using standard JDK dynamic proxies for AOP proxies. This enables any interface (or set of interfaces) to be proxied.
  41. [41]
    EMF Core - Eclipse Modeling Framework
    EMF - The core EMF framework includes a meta model (Ecore) for describing models as well as runtime support for the models, including change notification, ...
  42. [42]
    The Eclipse Modeling Framework (EMF) Overview
    Jun 16, 2005 · For those of you that are familiar with OMG (Object Management Group) MOF (Meta Object Facility), you may be wondering how EMF relates to it.
  43. [43]
    [PDF] Defining Domain-Specific Modeling Languages - DSM Forum
    Although all the DSM languages studied were implemented as metamodels and were not tied to customizing an available language, the approaches identified may also ...Missing: metaobjects | Show results with:metaobjects
  44. [44]
    [PDF] Model-Driven Engineering with Domain-Specific Meta ... - miso
    In current MDE practice, DSMLs are built by the language designer using a meta-model expressed with a general-purpose meta-modelling language, like the. MOF [37] ...Missing: metaobjects DSMs
  45. [45]
    [PDF] OMG Meta Object Facility (MOF) Core Specification
    This is the OMG Meta Object Facility (MOF) Core Specification, version 2.4.1, an Object Management Group specification.
  46. [46]
    [PDF] Meta Object Facility (MOF) Specification
    The MOF can be used to automate meta data management of data warehouses. Current meta data repositories that manage data warehouses often use static meta ...
  47. [47]
    A Type-Safe Template Language for Low-Code Development
    Nov 11, 2021 · This paper introduces OSTRICH, a strongly-typed rich templating language for a low-code platform (OutSystems) that builds on metamodel annotations.