Inheritance
- Core
- Tutorials
- Examples
- Snippets
Inheritance
In this tutorial we will learn how to create sets of Trials/Stimuli/Media and use them for randomization.
Sets are essentialy lists of objects that allow us to select objects out of them. The typical set definition looks something like this:
    API.addMediaSet('setName',[
        media1,
        media2
    ]);
 Using objects from a set is simple. all you have to do is add the inherit property to the inheriting object.
 There are two syntax types for inheriting.
 The simplified version randomly inherits a media object form the set 'mediaSet':
    media: {inherit: 'mediaSet'}
The full syntax allows you to pick the inheritance type:
    media: {
        inherit: {
            set: 'mediaSet',
            type: 'exRandom'
        }
    }
// # Inheritance
// In this tutorial we will learn how to create sets of Trials/Stimuli/Media and use them for randomization.
// Sets are essentialy lists of objects that allow us to select objects out of them.
// The typical set definition looks something like this:
//		API.addMediaSet('setName',[
//			media1,
//			media2
//		]);
// Using objects from a set is simple. all you have to do is add the `inherit` property to the inheriting object.
// There are two syntax types for inheriting.
// The simplified version randomly inherits a media object form the set 'mediaSet':
//		media: {inherit: 'mediaSet'}
// The full syntax allows you to pick the inheritance type:
//		media: {
//			inherit: {
//				set: 'mediaSet',
//				type: 'exRandom'
//			}
//		}
define(['pipAPI'], function(APIconstructor) {
	var API = new APIconstructor();
	// #### media sets
	// We define a set of media objects and call it *good*.
	API.addMediaSets('good', [
		{word: 'Paradise'},
		{word: 'Pleasure'},
		{word: 'Cheer'},
		{word: 'Wonderful'},
		{word: 'Splendid'},
		{word: 'Love'}
	]);
	// We define a set of media objects and call it *bad*.
	API.addMediaSets('bad', [
		{word: 'Bomb'},
		{word: 'Abuse'},
		{word: 'Sadness'},
		{word: 'Pain'},
		{word: 'Poison'},
		{word: 'Grief'}
	]);
	// #### Stimulus sets
	// We define two types of stimuli: bad media on the left, good media on the right.
	// This way, we use inheritance to style each media set in a uniform way.
	API.addStimulusSets("Default", [
		// randomly inherit a media object from the 'bad' media set
		{
			data: {type:'bad'},
			location: {left:30},
			media: {inherit:'bad'}
		},
		// randomly inherit a media object from the 'good' media set
		{
			data: {type:'good'},
			location: {right:30},
			media: {inherit:'good'}
		}
	]);
	// #### Trial sets
	// We define only one trial, this is inherantly gives us a shortcut to this trial, and will eventuall allow us to use it as a prototype. </br>
	// This trial simply displays a random stimulus.
	API.addTrialSets("Default", [
		{
			input: [{handle: 'end', on:'space'}],
			layout: [{inherit:'Default'}],
			interactions: [
				{
					conditions: [{type:'inputEquals',value:'end'}],
					actions: [{type:'endTrial'}]
				}
			]
		}
	]);
	// #### sequence
	API.addSequence([
		// ##### Simple inheritance
		// We can simply inherit the Default trial and have it display random stimuli.
		{inherit:'Default'},
		{inherit:'Default'},
		{inherit:'Default'},
		// ##### Exclusive Randomization
		// `exRandom`: pick a random object with exclusion.
		// Repeated calls to `exRandom` will not return the same object until all objects in the set have been used. </br>
		// Specificaly this Trial presents a random 'bad' media object (note that in this case we inherit a media object, not a stimulus).
		{
			input: [{handle: 'end', on:'space'}],
			layout: [
				/* begin stimulus */
				{
					/* begin media */
					media: {
						inherit:{
							set:'bad',
							type:'exRandom'
						}
					}
					/* end media */
				}
				/* end stimulus */
			],
			interactions: [
				{
					conditions: [{type:'inputEquals',value:'end'}],
					actions: [{type:'endTrial'}]
				}
			]
		},
		// ##### Inherit by Data
		// `byData` checks if the inherit objtects' `data` property is a subset of the elements' `data` property and if it is it picks the element.
		// (this means that if all properties of `data` equal to the properties of the same name in `element.data` it is a fit). </br>
		// Specificaly, this trial picks the stimulus that has `data:{type:'good'}` (note that in this case we inherit a whole stimulus object).
		{
			input: [{handle: 'end', on:'space'}],
			layout: [
				/* begin stimulus */
				{
					inherit:{
						set:'Default',
						type:'byData',
						data: {type:'good'}
					}
				}
				/* end stimulus */
			],
			interactions: [
				{
					conditions: [{type:'inputEquals',value:'end'}],
					actions: [{type:'endTrial'}]
				}
			]
		},
		// ##### Prototyping
		// One of the greatest powers of inheritance is prototyping; using a the inheritance as a template for more advanced elements.
		// When an element (the child) has an inherit property, then the child is used to extend the inherited element (the parent).
		// What this means is that inherited properties are overwritten by explicit properties. Let's see how this works.
		{
			// Inherit the 'Default' trial.
			inherit: 'Default',
			// The layout property gets overridden
			layout: [{media:{word:'One Child'}}]
		},
		{
			// Inherit the 'Default' trial.
			inherit: 'Default',
			// The layout property gets overriden in a different way.
			layout: [{media:{word:'A differen child'}}]
		}
	]);
	return API.script;
});
License: Apache 2. © Project Implicit. · Current version [version]