One side of the work I do for my clients is XML and related technologies, the other side is general data modelling. One thing that interests me in data modelling is the use of metamodels. Now, what is a metamodel? Normally, people switch off or break into a cold sweat when they hear "meta-anything" in a sentence. However, there is nothing scary about metamodels. A metamodel simply defines what things are allowed to be in your data models; it's a model of what you are allowed to have in your data models.
Why do we need metamodels? It's because data modelling is usually done using general purpose modelling technologies. Examples are E-R diagrams, UML, and XML Schemas. Any of these general purpose modelling technologies give you more features than you need or want in any single project. It can be a major problem to constrain people to use as few features as possible, which is what you want to make your data models as simple to understand and as cheap to maintain as possible. The role of a metamodel is to define a limited set of features which are the only ones that can be used out of all of the features that the general purpose modelling methodology provides.
For example, it's common to find people using XML Schemas that (a) use elements only for data, not attributes, and (b) use local element definitions only in the XML Schemas, not global element definitions (root elements accepted). This constraining of XML Schema to a simple subset of its features is equivalent to defining a metamodel that is a subset of the full metamodel for XML Schema. In practice, you can implement just such a "metamodel validation" on an XML Schema by applying some kind of schema language to the XML Schema itself. As it happens, XML Schema editors often won't let you apply an XML Schema to another XML Schema, but you can apply both Schematron and/or RELAX NG to XML Schemas in order to implement checks that the XML Schemas conform to your metamodel (i.e. your design rules).
UML is widely used for data models, and metamodels for UML are written in using a thing called MOF. With the latest versions, UML 2 and MOF 2, MOF is now a subset of UML that can be used for writing metamodels which constrain UML models. Sadly, support for validating UML models using MOF metamodels is still poor (at least in any tools I have used), but I live in hope that within a couple of years it will be possible to validate a UML model with a MOF metamodel as easily as you can validate an XML document with an XML schema.
Today I was catching up on some reading, and I stumbled across a mention of JetBrains Meta Programming System (MPS). I tried an early version of this a couple of years ago; it lets you design custom/bespoke mini programming languages (or mini data formats) that are specific to a particular purpose. The MPS tutorial is a good way to get a feel for MPS, what it does, and how it works. There is an obvious analogy between defining a mini-language for a task rather than letting people loose with a general purpose language, and using a metamodel to constrain people's usage of the features of a general purpose modelling methodology. MPS allowed you to define structured data models that have something of the feel of (simple) textual computer program, or a textual data file like a simple properties file. Although they have the look of text files, they are actually structured, and in some ways it's not unlike generating form-based user interfaces or Web pages. MPS is a neat looking tool, and it's free. I like JetBrains (commercial) Intellij IDE for Java, because it's so clever in the degree of analysis it does of your code as your write it. I was amazed how many issues it was able to point out to me as I was writing my code, before I even compiled it. If the JetBrains folks can apply the same cleverness to MPS, it could be a useful tool. That said, it's not the only tool that can generate user interfaces from models. Eclipse has EMF (like a cut-down version of UML) and Visual Studio has support for Domain Specific Languages (DSL). All of these tools are working to the same end, to provide you with a way to allow people to work with only the minimum set of features that are needed for any particular problem, so that they produce the simplest, most consistent, most maintainable solution that they can.
Metamodels and their equivalents let you take a complex software tool or methodology, and constrain it to effectively turn it into a simpler software tool or methodology. It's a bit more effort, but for a project of any size, it can pay real benefits in the end.