  Model-driven development is a pragmatic approach to software development that
embraces domain-specific languages (DSLs), where models correspond to DSL
programs. A distinguishing feature of model-driven development is that clients
of a model can select from an open set of alternative semantics of the model by
applying different model transformation. However, in existing model-driven
frameworks, dependencies between models, model transformations, and generated
code artifacts are either implicit or globally declared in build scripts, which
impedes modular reasoning, separate compilation, and programmability in
general. We propose the design of a new module system that incorporates models
and model transformations as modules. A programmer can apply transformations in
import statements, thus declaring a dependency on generated code artifacts. Our
design enables modular reasoning and separate compilation by preventing hidden
dependencies, and it supports mixing modeling artifacts with conventional code
artifacts as well as higher-order transformations. We have formalized our
design and the aforementioned properties and have validated it by an
implementation and case studies that show that our module system successfully
integrates model-driven development into conventional programming languages.
