js-model icon indicating copy to clipboard operation
js-model copied to clipboard

Model.Coerce

Open ebaxt opened this issue 13 years ago • 7 comments

Hi, I had a stab at adding the Model.Coerce that came up in the date serialization discussion. I've added integer, boolean, float and isoDate coercion as a start since that is what I needed, but one can easily add more by adding to Model.Coerce.

The api looks like this:

var Post = Model("post", function() {
  this.persistence(Model.REST, "/posts"),
  this.coerce(Model.Coerce,
  {
    category_id: "integer",
    lat: "float",
    published: "boolean",
    pubDate: "isoDate"
  })
})

If this is something you would like to use I'll add docs and stuff.

ebaxt avatar Mar 31 '11 12:03 ebaxt

Cool, I'd like to include this in the main repo but probably not as core functionality. Rather, like this potential addition, I'd prefer it to be included manually with some sort of Plugin Architecture™ (probably very simple). What do you think?

benpickles avatar Apr 01 '11 10:04 benpickles

Sure, that sounds like a good idea. Are you currently working on something like that? If not I could probably give it a shot if you helped me define the API.

ebaxt avatar Apr 01 '11 11:04 ebaxt

I'm currently preparing the groundwork for it, it'll probably be something like this:

// first argument is the class
function SomeModuleOfFunctionality(klass, a, b) {
  // add some functionality to the class
  // can also add to the klass.prototype
}

// probably applied when declaring the model
var Project = Model("project", function() {
  this.use(SomeModuleOfFunctionality, "plus", "arguments")
}

// but can be called whenever
Project.use(SomethingElse)

update: fix code example

benpickles avatar Apr 01 '11 13:04 benpickles

Looks like @github's new reply-via-email thing needs a little more work...

benpickles avatar Apr 01 '11 13:04 benpickles

I've just pushed a few changes which include a simple "plugin architecture" which is used like so:

// first argument is the class
function SomeModuleOfFunctionality(klass, a, b) {
  // add some functionality to the class
  // can also add to the klass.prototype
}

// probably applied when declaring the model
var Project = Model("project", function() {
  this.use(SomeModuleOfFunctionality, "plus", "arguments")
}

// but can be called whenever
Project.use(SomethingElse)

benpickles avatar Apr 07 '11 17:04 benpickles

Cool. I'll update my pull request to use the new "plugin architecture".

ebaxt avatar Apr 08 '11 15:04 ebaxt

Moved Model.Coerce to Plugin.Coerce to make use of the new "plugin architecture". Not sure how you want to bundle the plugins so I just left it for now.

ebaxt avatar Apr 12 '11 18:04 ebaxt