Makes sense. Why again did you not want extension features to just add to
.prototype directly?
At the very least I'd suggest a "static" method to hide the mixins_ member
variable. I'd prefer a method to a variable into which you stuff content
since it defines the API better.
So something like:
opensocial.container.Container.addMixin = function(mixin) {
// add mixin somewhere, which gets merged on ctor call
};
--j
On Tue, Mar 8, 2011 at 11:04 AM, Ryan J Baxter <[email protected]> wrote:
> We are in the process of writing several new features that would like to
> extend the common container with some new functionality. But lets say I
> am writing a new feature called foo. In foo's container code in the
> feature I would have to do something like this
>
> shindig.container.Container.prototype.mixins_['foo'] = function(context){
> return {
> "fooMethod" : function(){
> ......
> }
> };
> }
>
> On my page, if I include the common container feature and my foo feature I
> would be able to do something like this
>
> var container = new shindig.container.Container();
> container.foo.fooMethod();
>
> The mixins method gets called by the constructor of Container and just
> adds the methods to the Container object, but only if foo feature is
> included on the page.
>
> Hope that makes sense.
>
> -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 01:53 PM
> Subject: Re: Allow extensions to the common container by allowing
> other features to provide their own namespace (issue4260049)
>
>
>
> Well, what API did you want to expose for extension?
>
> By my (perhaps too quick) read of this code you'd have to create a
> Container object, then do container.mixins_ = { bunch of mixins };, then
> call containerObj.mixin_();
>
> In such case, may as well isolate state and just have the mixin method
> itself take a method.
>
> --j
>
> On Tue, Mar 8, 2011 at 10:44 AM, Ryan J Baxter <[email protected]>
> wrote:
> 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);
> + }
> +}
>
>
>
>
>
>
>
>
>
>
>
>