John, I am not so clear on what your suggesting. I understand you don't like the variable, but I don't see how you could execute a method to do the "mixin" on the Container object when it has not been created yet. I want a feature to be able to add it's own methods to the Container object in its own namespace. So the mixins_ variable would only be used by other features.
-Ryan Email: [email protected] Phone: 978-899-3041 developerWorks Profile From: John Hjelmstad <[email protected]> To: [email protected], Cc: Ryan J Baxter/Westford/IBM@Lotus Date: 03/08/2011 12:59 PM Subject: Re: Allow extensions to the common container by allowing other features to provide their own namespace (issue4260049) Hi Ryan: The pattern of exposing a magical variable that's read when you call this.mixin_() seems a little odd to me. I'd prefer to have something more direct, ie have the mixin method itself take a method/function (which we could define as being bound to "this" if you like). --j On Tue, Mar 8, 2011 at 9:36 AM, Ryan J Baxter <[email protected]> wrote: Anyone have any objections to this? I would like to get this submitted. -Ryan Email: [email protected] Phone: 978-899-3041 developerWorks Profile From: [email protected] To: [email protected], [email protected], [email protected], Cc: [email protected], [email protected] Date: 03/04/2011 11:36 AM Subject: Allow extensions to the common container by allowing other features to provide their own namespace (issue4260049) Reviewers: mhermanto, dev_shindig.apache.org, dev-remailer_shindig.apache.org, Description: At the moment the common container cannot be extended by adding a new namespace and still have access to the container object. The only reasonable way to extend the common container at this moment it to add new methods by calling .prototype or by subclassing it. Another useful extension would be to allow features to add their own namespace to the common container and add new methods under that common container. However those methods may still want to reference other methods inside the common container so they need to be able to access the common container object itself. Please review this at http://codereview.appspot.com/4260049/ Affected files: features/src/main/javascript/features/container/container.js features/src/test/javascript/features/container/container_test.js ### Eclipse Workspace Patch 1.0 #P shindig-project Index: features/src/test/javascript/features/container/container_test.js =================================================================== --- features/src/test/javascript/features/container/container_test.js (revision 1078023) +++ features/src/test/javascript/features/container/container_test.js (working copy) @@ -112,6 +112,22 @@ this.assertTrue(container.sites_[2] != null); }; +ContainerTest.prototype.testMixins_ = function(){ + this.setupGadgetsRpcRegister(); + shindig.container.Container.prototype.mixins_['test'] = function(context){ + return { + "getSitesLength" : function(){ + return context.sites_.length; + } + }; + }; + var container = new shindig.container.Container(); + this.setupGadgetSite(1, {}, null); + container.newGadgetSite(null); + this.assertTrue(container.sites_[1] != null); + this.assertEquals(container.sites_.length, container.test.getSitesLength()); +}; + ContainerTest.prototype.setupGadgetSite = function(id, gadgetInfo, gadgetHolder) { var self = this; shindig.container.GadgetSite = function() { @@ -137,4 +153,4 @@ register: function() { } }; -}; +}; \ No newline at end of file Index: features/src/main/javascript/features/container/container.js =================================================================== --- features/src/main/javascript/features/container/container.js (revision 1078023) +++ features/src/main/javascript/features/container/container.js (working copy) @@ -113,6 +113,8 @@ * @private */ this.tokenRefreshTimer_ = null; + + this.mixin_(); this.preloadFromConfig_(config); @@ -121,7 +123,6 @@ this.onConstructed(config); }; - /** * Create a new gadget site. * @param {Element} gadgetEl HTML element into which to render. @@ -636,3 +637,18 @@ } }); }; + +/** + * Adds the ability for features to extend the container with + * their own functionality that may be specific to that feature. + */ +shindig.container.Container.prototype.mixins_ = {}; + +/** + * Called from the constructor to add any namespace extensions. + */ +shindig.container.Container.prototype.mixin_ = function(){ + for(var i in this.mixins_){ + this[i] = new this.mixins_[i](this); + } +}
