You can create and use any existed widget type in your Magento site.
{{widget type="cms/widget_page_link" template="cms/widget/link/link_block.phtml" page_id="2"}}
<block type="cms/widget_page_link" name="widget_page_link" as="widget_page_link" template="cms/widget/link/link_block.phtml">
<action method="setPageId">
<value>2</value>
</action>
</block>
// 3.1. Default
echo $this->getLayout()->createBlock('cms/widget_page_link')
->setTemplate('cms/widget/link/link_block.phtml')
->setPageId(2)
->toHtml();
// 3.2. Use widget template filter model (code same like in static block or cms page)
$filter = Mage::getModel('widget/template_filter');
echo $filter->filter('{{widget type="cms/widget_page_link" template="cms/widget/link/link_block.phtml" page_id="2"}}');
Same as in *.phml
you just need to create own custom method and return html
code of rendered widget.