Not a developer? Go to



About MT::Revisable interface

Movable Type 5 comes with a revision history framework built in. What does that mean? It means that a developer can easily use revision history for own objects.

The following methods are supported on any revisable object:


Creates the hashref that will be stored as a particular revision of the object. By default, this hashref contains the values of the object’s normal and meta columns. The ”<package>::pack_revision” callback can be used to add values from the plugin to be stored with the revision.


The opposite of ”pack_revision”, takes the ”$packed_obj” hashref and unpacks it, setting the values of ”$obj” as needed. The ”<package>::unpack_revision” callback can be used for any other keys added to ”$packged_obj” that are not part of the normal or meta columns.


Called automatically when an object is saved from the MT web interface or posted via a 3rd party client (on a low priority api/cms_post_save callback). Saves a revision only if at least one revisioned column has changed.

 $obj->load_revision(\%terms, \%args)

Loads revisions for the ”$obj”. Arguments work similarly to ”MT::Object->load”. Thus, one can simply do ”$obj->load_revision($rev_numer)” or pass terms and args. load_revision should return an/array of arrayref(s).

 $obj->apply_revision(\%terms, \%args)

Rolls back to the state of the object at ”$obj-load_revision(\%terms, \%args)” and saves this action as a revision.

Manage revision history

Inheriting from the Revisable Interface

To make an object revisable, a developer do need only two actions.

  • Their package inherits from the MTRevisable interface.
  • Add ‘revisioned’ to any column.

Here is the sample code.

    package My::Object::Model;
    use base qw ( MT::Object MT::Revisable );

        'id'   => 'integer not null auto_increment',
        'text' => 'string(255) not null revisioned',
        # ...


Using the MT::Revisable Interface

Then you get the methods in the Revisable interface on your model objects:

    sub load_my_revision {
        my ( $obj_id, $rev_id ) = @_;
        my $obj = My::Object::Model->load( $obj_id );
        my $rev = $obj->load_revision( { rev_number => $rev_id } );

        # ...