title: SourceObject --- summary: The basic interface of all source objects. --- module: lektor.db --- type: class --- body: Source objects is the common interface for all things that come out of the database. There are two types of source objects: * [Records :ref](../record/) which are pages and attachments from the `contents/` folder. * [Assets :ref](../asset/) which are files and directories from the `assets/` folder. Whatever object you have in hands that comes from the database, they will at least provide a minimal useful set of API methods and properties. Plugins can subclass source objects to come up with their own source objects if needed. In addition to that there is a special source object called the `VirtualSourceObject` which is more useful for plugin usage. ## Virtual Source Objects Most plugins will not have source objects that actually originate on the file system. This means that their "source" is entirely virtual. Because this is a very common situation there is a base class, the `VirtualSourceObject` which plugins can subclass. The constructor takes one argument which is the parent source object the virtual source lives below. ```python from lektor.sourceobj import VirtualSourceObject class Source(VirtualSourceObject): @property def source_content(self): with open(self.parent.source_filename) as f: return f.read().decode('utf-8') @property def url_path(self): return self.parent.url_path + 'source.txt' ``` For more information see [add-build-program :ref](../../environment/add-build-program/).