[SalesForce] Extending Lightning Components not working

My goal initially was to avoid pasting my common functions into every new components helper.js file (previously researched) and I found out that you can extend the components (some example codes) I tried making a very simple base/abstract component and extending it like so:

1.Abstract component:

<aura:component extensible="true">
    <aura:handler name="init" value="{!this}" action="{!c.doInit}" />
    <!--<aura:handler event="aura:waiting" action="{!c.loaderStart}"/>-->
    <!--<aura:handler event="aura:doneWaiting" action="{!c.loaderStop}"/>-->
    <p>This is inside abstract</p>
</aura:component>

abstract controller

({
    doInit: function(component, event, helper) {
        console.log('doInit', component, event, helper);
    }
    /*
    loaderStart: function(component, event, helper) {
        console.log('loaderStart');
    },
    loaderStop: function(component, event, helper) {
        console.log('loaderStop');
    }
    */
})

abstract helper (just a bunch of simple stuff)

({
    closeQuickAction: function () {
        $A.get('e.force:closeQuickAction').fire();
    },
    refreshView: function () {
        $A.get('e.force:refreshView').fire();
    },
    navigateToRecord: function (recordId) {
        // 'slideDevName': ( 'chatter', 'related', 'detail' )
        $A.get('e.force:navigateToSObject').setParams({'recordId': recordId, 'slideDevName': 'related'}).fire();
    }
})

2.And the component that extends it:

<aura:component extends="c:CmpBase" implements="force:lightningQuickAction">
    <p>This is inside extender</p>
    <lightning:button type="button" label="Test"/>
</aura:component>

This components (2) content does not show. Why?

Edit: contents and the console.log of the abstract component do show!

Found the docs:
https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/oo_cmp_attributes.htm

Best Answer

In the abstract component you need to place the body:

<p>This is inside abstract</p>
{!v.body}

which is where the extending component's content is placed.

(When I had this problem I didn't manage to find an explicit explanation, just that examples had the {!v.body} in the abstract component.)