# Features¶

Architect has a concept of “features”. A feature in Architect is something that can somehow enhance the ORM Architect is used with, e.g. table partitioning. Architect provides a single interface to all of its features despite of the ORM being used.

## install ¶

All features in Architect are installed into models using install decorator. An install decorator in it’s general form can be written as the following:

import architect

@architect.install(feature, **options)
class Model(object):
pass


where feature is the feature name as a string which should be installed into the model class and options are the options that this feature takes (if any) in the form of keyword arguments. If a model wants to use several features, this can easily be done with applying several decorators at once, like this:

import architect

@architect.install(feature1, **options1)
@architect.install(feature2, **options2)
@architect.install(feature3, **options3)
class Model(object):
pass


All installed features can be found inside architect namespace inside the model, e.g.:

>>> print(dir(Model.architect))
['__class__', '__dict__', 'feature1', 'feature2', 'feature3']


This provides 100% non-conflicting behaviour with all ORMs and other 3rd party packages.

Note

Architect tries its best to automatically determine what ORM it is being used with, however there can be situations when it can fail to properly do that. To help Architect, one can pass an orm option to the install decorator and set it to the needed ORM.

## uninstall ¶

Under some circumstances a model might not need one or all of the installed features anymore, one example can be a model inheritance, where the parent model has a feature installed and a child model doesn’t want to use it. A feature can be easily uninstalled from a model using uninstall decorator:

import architect

@architect.uninstall(feature)
class ChildModel(object):
pass


where a feature is a feature name as a string which was installed before.