Using values from one entry as default values in another? Is it possible to do the following in Craft?

I want to set up course information as follows:

1) have a courseType which contains default values for that type of course - name (i.e. 3 hour skills, full day masterclass etc), price, capacity, trainers etc

2) have a course which has a courseType entry filed among other details such as details of the course, equipment used, etc. The course will also have fields for price, trainers &amp; capacity.

Is it possible to have the course price, trainers &amp; capacity fields filled with the value of the courseType selected when it is chosen in the CP new course page? These course fields should then be able to be overridden if required on a course by course basis.   

Any suggestions would be very welcome - I'm new to craft and can find any examples like this.

Thanks in advance.
First of all I would like to leave a few links for you. 


Pluginfactory.io is a page where you can create your "starting" files. It creates an empty Plugin, with all the required files/functions with example codes for routing and services....
The Docs about Craft Plugin developement


Then to the code: you'll need to insert a function like this in your Plugin's primary class

craft()-&gt;templates-&gt;hook('cp.entries.edit', function(&amp;$context) {
    if ($context['sectionHandle'] === 'course') {
        // you can get these from a config file or you could create
        // plugin settings, I'll just insert an array here, it's faster
        $config = [
            'entryTypeOne'     =&gt; [
                'title'         =&gt; 'A title',
                'body'          =&gt; 'some information',
                'relationField' =&gt; [1, 2, 4] //&lt;-- array of element ids
            ],
            'anotherEntryType' =&gt; [
                'title'         =&gt; 'Another title',
                'body'          =&gt; 'some more information',
                'relationField' =&gt; [] //&lt;-- array of element ids
            ]
        ];

        /** @var \Craft\EntryModel $entry */
        $entry = $context['entry'];
        $entry-&gt;getContent()-&gt;setAttributes($config[$entry-&gt;getType()-&gt;handle]);
    }
}


However: unfortunately you can't set default values when the user changes the entry type with this method, thus we'll need another "hack".
As you can see in the Relabel Plugin Craft provides ways to change default functions. You can insert this javascript

Craft.EntryTypeSwitcher.prototype.onTypeChange =  function(ev)
{
    this.$spinner.removeClass('hidden');

    Craft.postActionRequest('entries/switchEntryType', Craft.cp.$container.serialize(), $.proxy(function(response, textStatus) {
        this.$spinner.addClass('hidden');

        if (textStatus == 'success')
        {
            var fieldsPane = this.$fields.data('pane');
            fieldsPane.deselectTab();
            this.$fields.html(response.paneHtml);
            fieldsPane.destroy();
            this.$fields.pane();
            Craft.initUiElements(this.$fields);

            Craft.appendHeadHtml(response.headHtml);
            Craft.appendFootHtml(response.footHtml);

            // Update the slug generator with the new title input
            if (typeof slugGenerator != "undefined")
            {
                slugGenerator.setNewSource('#title');
            }
        }
    }, this));
}


To change the default behavior when someone changes the entry type. All you have to do is to change the destination of the script 
from 

Craft.postActionRequest('entries/switchEntryType'


to something like

Craft.postActionRequest('yourpluginhandle/controllername/switchEntryType'


Then you'll take the default EntriesController function

public function actionSwitchEntryType()
{
    $this-&gt;requirePostRequest();
    $this-&gt;requireAjaxRequest();

    $entry = $this-&gt;_getEntryModel();
    $this-&gt;enforceEditEntryPermissions($entry);
    $this-&gt;_populateEntryModel($entry);

    $variables['sectionId'] = $entry-&gt;sectionId;
    $variables['entry'] = $entry;
    $variables['showEntryTypes'] = true;

    $this-&gt;_prepEditEntryVariables($variables);

    $paneHtml = craft()-&gt;templates-&gt;render('_includes/tabs', $variables) .
        craft()-&gt;templates-&gt;render('entries/_fields', $variables);

    $this-&gt;returnJson(array(
        'paneHtml' =&gt; $paneHtml,
        'headHtml' =&gt; craft()-&gt;templates-&gt;getHeadHtml(),
        'footHtml' =&gt; craft()-&gt;templates-&gt;getFootHtml(),
    ));
}


And do exactly the same like in the first function

$entry-&gt;getContent()-&gt;setAttributes($config[$entry-&gt;getType()-&gt;handle]);


Unfortunately if you want to take care of all use cases you have to overwrite another function. When someone is trying to create an entry via an ElementEditor(the thing that pops up when you click on "new entry") in a relation field. It works exactly the same like my first method and it's the same like Here