Object Mixins
by Aubrey Taylor
HTML
<h1>Module Mixin Builder Example</h1>
CSS
h1{
font-family: sans-serif;
font-weight:bold;
font-size:25px;
padding-bottom:15px;
padding-left:10px;
padding-top:10px;
}
h2{
font-family: sans-serif;
font-weight: bold;
font-size: 18px;
color:#333;
padding-bottom:5px;
padding-left:10px;
padding-top:10px;
}
p{
font-family: Courier, sans-serif;
font-size: 13px;
padding-left:10px;
}
JavaScript
var Fiddle = Fiddle || {};
Fiddle.Module = function(){
var self = {};
function __new__(){
}
/* initialization */
function __init__(){
self.name = 'Fiddle.Module';
}
// do not delete //
__new__();
__init__();
return self;
// #eo do not delete //
};
Fiddle.Mixer = function(){
var self = {};
function __new__(){
self.mix = mix;
}
/* initialization */
function __init__(){
self.name = 'Fiddle.Mixer';
}
/* public methods */
// mix(foo, fooMixin, [methods(optoinal)]);
function mix(base, mixin, methods){
methods = methods || false;
if(methods !== false){
pick(base, mixin, methods);
}else{
copy(base, mixin);
}
}
/* private methods */
function pick(base, mixin, methods){
var methodName;
var method;
for(var i=methods.length-1; i>=0; i--){
methodName = methods[i];
method = mixin[methodName];
base[methodName] = method;
}
}
function copy(base, mixin){
var methodName;
var method;
// should we check for duplicate signatures?
// if we do, do we skip? override? or rename?
// simplest first, override.
for(methodName in mixin){
if(mixin.hasOwnProperty(methodName)){
method = mixin[methodName];
base[methodName] = method;
}
}
}
// do not delete //
__new__();
__init__();
return self;
// #eo do not delete //
};
Fiddle.ModuleMixin = function(){
var self = {};
function __new__(){
self.foo = foo;
self.bar = bar;
}
/* initialization */
function __init__(){
self.name = 'Fiddle.ModuleMixin';
}
/* public methods */
function foo(){
return 'foo';
}
function bar(){
return 'bar';
...