Seems pretty reasonable to me, thanks Ryan
On Tue, Mar 8, 2011 at 12:23 PM, Ryan J Baxter <[email protected]> wrote:
> I started just adding to the .prototype directly but then I thought about
> x number of features doing this and decided it would be cleaner if they
> had the ability to add their specific functionality in their own
> namespace. Of course that only my opinion :)
>
> The only place I can think of to add a static function would be in
> shindig.container.utils. So maybe something like this, which would hide
> the use of the variable.
>
> shindig.container.utils.addContainerMixin = function(namespace, func){
> shindig.container.Container.prototype.mixins_[namespace] = func;
> }
>
> -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 02:31 PM
> Subject: Re: Allow extensions to the common container by allowing
> other features to provide their own namespace (issue4260049)
>
>
>
> 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);
> > + }
> > +}
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
>
>
>
>