s = function(baseInput){
    console.log('> new BaseClass(%s)', Array.prototype.slice.call(arguments).toString());

    var basePrivateVar = (baseInput)?('(private)' + baseInput):'baseSecret';
    this.basePublicVar = (baseInput)?('(public)' + baseInput):'baseNotSecret';

    function secretTellBaseSecret(){
        console.log('> BaseClass::secretTellBaseSecret(%s)', Array.prototype.slice.call(arguments).toString());
        return basePrivateVar;
    }

    this.tellSecret = function(){
        console.log('> BaseClass::tellSecret(%s)', Array.prototype.slice.call(arguments).toString());
        var x = secretTellBaseSecret();
        return secretTellBaseSecret();
    };
};
BaseClass.prototype = {
    tellSecret: function(){
        console.log('> BaseClass.prototype.tellSecret(%s)', Array.prototype.slice.call(arguments).toString());
        return this.tellSecret();
    }
};

var AdvancedClass = function(baseInput, advInput){
    console.log('> new AdvancedClass(%s)', Array.prototype.slice.call(arguments).toString());
    BaseClass.call(this, baseInput);

    var advPrivateVar = (advInput)?('(private)' + advInput):'advSecret';
    this.advPublicVar = (advInput)?('(public)' + advInput):'advNotSecret';

    function secretTellAdvSecret(){
        console.log('> AdvancedClass::secretTellAdvSecret(%s)', Array.prototype.slice.call(arguments).toString());
        return avdPrivateVar;
    };

    this.tellASecret = function(){
        console.log('> AdvancedClass::tellSecret(%s)', Array.prototype.slice.call(arguments).toString());
        return secretTellAdvSecret.call(this);
    };
};
AdvancedClass.prototype = Object.create(BaseClass.prototype, {
    tellBaseSecret: {
        value: function(){
            console.log('> AdvancedClass.prototype.tellBaseSecret', Array.prototype.slice.call(arguments).toString());
            return BaseClass.prototype.tellSecret.apply(this, arguments);
        },
        enumerable: true
    }
});
AdvancedClass.prototype.constructor = AdvancedClass;

var A1 = new BaseClass("A1's sec