If a developer wanted to have a site-wide base page class, and also have
some pages be `RoutablePage`s, a conflict between the automatically
generated `page_ptr` fields would occur.
```python
from wagtail.wagtailcore.models import Page
from wagtail.contrib.wagtailroutablepage.models import RoutablePage
class SitePageBase(Page):
# common functionality
is_abstract = True
class Meta:
abstract = True
class MyPage(RoutablePage, SitePageBase):
# This model is invalid
pass
```
`RoutablePage` has been changed to be a mixin `RoutablePageMixin`. Page
classes can use this to gain the `RoutablePage` functionality while
still retaining the ability to subclass other models.
A `RoutablePage` class that derives from both `RoutablePageMixin` and
`Page` has been left in for backwards compatibility, so old code will
continue to function without any modifications.
It is similar to `pageurl`, but works with `RoutablePage`s. Functions
like a hybrid between `reverse` and `pageurl`. For example:
{% load wagtailroutablepage_tags %}
{% routablepageurl self "feed" %}
{% routablepageurl self "archive" 2014 08 14 %}
{% routablepageurl self "food" foo="bar" baz="quux" %}