node-oops
Version:
A small library that makes object-oriented programming in javascript a little simpler.
111 lines (96 loc) • 2.45 kB
JavaScript
var oops = require('../').noConflict()
, defines = oops.create
, util = require('util')
, events = require('events')
;
/**
* Simple observable person object
*/
function Person(firstname, lastname, middlenames) {
Person.super_.call(this);
var _priv = {
first: firstname || '-unknown-',
last: lastname || '-unknown-',
middle: middlenames || '-unknown-'
};
defines(this)
.value('_state', {})
.property('first_name',
function() { return _priv.first; },
function(first) {
first = first || '-unknown-';
if (first !== _priv.first) {
var change = {
what: 'first_name',
from: _priv.first,
to: first
};
_priv.first = first;
this.emit('property-changed', change);
}
})
.property('last_name',
function() { return _priv.last; },
function(last) {
last = last || '-unknown-';
if (last !== _priv.last) {
var change = {
what: 'last_name',
from: _priv.last,
to: last
};
_priv.last = last;
this.emit('property-changed', change);
}
})
.property('middle_names',
function() { return _priv.middle; },
function(middle) {
middle = middle || '-unknown-';
if (middle !== _priv.middle) {
var change = {
what: 'middle_names',
from: _priv.middle,
to: middle
};
_priv.middle = middle;
this.emit('property-changed', change);
}
})
;
}
oops.inherits(Person, events.EventEmitter);
/**
* The default fullname formatter.
*/
function fullnameFormatter( first, last, middle ) {
return ''.concat(first,
(last) ? ' '.concat(last) : '',
(middle) ? ' '.concat(middle) : '');
}
function full_name() {
var f = this._state.formatter || fullnameFormatter;
return f(this.first_name, this.last_name, this.middle_names);
}
function overrideFormatter( formatter ) {
this._state.formatter = formatter;
}
defines(Person).enumerable
.method(overrideFormatter)
.property(full_name);
var me = new Person('willie', 'wonka');
me.on('property-changed', function(change) {
console.log('property changed: '.concat(util.inspect(change)));
console.log('name: '.concat(me.full_name));
});
console.log("initial me: ".concat(me.full_name));
me.first_name = 'Phillip';
me.last_name = 'Clark';
me.middle_names = '-ithinknot-';
me.overrideFormatter(
function ( first, last, middle ) {
return ''.concat(last, ', ',
(first) ? ' '.concat(first) : '',
(middle) ? ' '.concat(middle) : '');
});
console.log("final me: ".concat(me.full_name));