cop.create("CiteLayer").refineClass(lively.morphic.Text, {
    followBibliographicReference: function() {
        alertOK("show reference " + this.currentBibliographicReference)
    },
    onMouseUp: function(evt) {
        var s = this.selectionString();
        if (this.followCiteButton) this.followCiteButton.remove();
        if (s.match(/[A-Z][a-z]+[0-9][0-9][0-9][0-9][A-Z]+/)) {
            this.currentBibliographicReference = s;
            var b = new lively.morphic.Button(new Rectangle(0,0,50,20), "show")
            b.isEpiMorph = true;
            lively.bindings.connect(b, 'fire', this, 'followBibliographicReference')
            this.addMorph(b)
            b.align(
                b.getBounds().bottomLeft(),
                this.localize(this.getSelectionBounds().topRight()));
            this.followCiteButton = b;
        }
        return cop.proceed(evt)
    }
})
$morph('DevArea').setWithLayers([cop.create("CiteLayer")])