the Options mixin //it merges the options passed in with the defaults this.setOptions(options); //we store the terms and definitions this.terms = this.container.getElements(this.options.terms); this.definitions = this.container.getElements(this.options.definitions); //we call our attach method //by breaking this into its own method //it makes our class easier to extend this.attach(); }, attach: function(){ //loop through the terms this.terms.each(function(term, index) { //add a click event to each one term.addEvent('click', function(){ //that calls our toggle method for //the current index this.toggle(index); }, this); }, this); }, toggle: function(index){ //toggle open the definition for the given index this.definitions[index].slide('toggle'); }});Uau! E um bocado de codigo. Mesmo se removermos todos os comentarios, ainda teremos duas duzias de linhas de codigo. Ja mostrei anteriormente que podemos construir esse plug-in com aproximadamente a mesma quantidade de codigo que na versao do jQuery. Entao porque essa e tao mais comprida? Bem, fizemos dela muito mais flexivel. Para usar este prototipo, podemos apenas chamar o construtor, dessa maneira: var myFAQ = new FAQ(myContainer);//and now we can call methods on it if we want:myFAQ.toggle(2); //toggle the 3rd elementPodemos acessar metodos e propriedades dessa instancia. Mas e sobre nossa funcionalidade AJAX? O problema com nossa extensao AJAX na versao do jQuery e que nao podiamos atrasar a animacao ate o termino do carregamento do conteudo. Nao temos este problema com nossa versao no MooTools. var FAQ.Ajax({ //this class inherits the properties of FAQ Extends: FAQ, //it also gets a new option in addition to the other defaults //this one for url, that we're going to append the index of the //term to; in reality we might make this more robust, but for //this example it serves the purpose options: { url: null; }, //we're going to cache the results, so if a section is opened //twice, we won't hit the server for the data indexesLoaded: [], toggle: function(index){ //if we've already loaded the definition if (this.indexesLoaded[index]) { //just call the previous version of toggle this.parent(index); } else { //otherwise, request the data from the server new Request.HTML({ update: this.definitions[index], url: this.options.url + index, //and when the data is loaded, expand the definition onComplete: function(){ this.indexesLoaded[index] = true; this.definitions[index].slide('toggle'); } }).send(); } }});Agora temos uma versao do nosso prototipo FAQ que permite procurar respostas no servidor. Note que somos capazes de integrar a nova logica de uma forma que nao anima a resposta ate depois do conteudo voltar do servidor (o que nao conseguiamos fazer na versao com o jQuery). Note tambem que nos apenas tivemos descrever a nova funcionalidade (AJAX) e escrever um pouco mais. Essa extensibilidade permite a criacao de familias de plug-ins que oferecam diferentes formas de funcionalidade. Ela permite tambem que voce utilize o plug-in de outra pessoa e altere, se precisar, apenas alguns bits que voce gostaria que fossem diferentes (sem precisar fazer um fork). Isso ajuda a explicar o porque, para cada funcionalidade (seletores de data, interface de abas, etc), voce encontra apenas alguns plug-ins para a MooTools. A maioria dos plug-ins que voce pega, ou resolve seu problema, ou voce simplesmente pode melhora-los com as coisas que voce precisa.Como mostrei anteriormente, e