Created
January 18, 2012 22:39
-
-
Save foca/1636276 to your computer and use it in GitHub Desktop.
Small implementation of Singletons for Backbone
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Public: generates a mixable singleton implementation dependent on a model key. | |
# Once you mix it into a model, your model gains an .instance method that will | |
# generate an object and cache it. Further calls to the .instance methods will | |
# return the same object. | |
# | |
# key - The name of the attribute we use to index instances. Defaults to "id". | |
# | |
# Example | |
# | |
# # Called without arguments uses the "id" as key. | |
# class Foo extends Backbone.Model | |
# _.extend this, Singleton() | |
# | |
# first_instance = Foo.instance(id: 1) | |
# second_instance = Foo.instance(id: 1) | |
# | |
# first_instance.cid == second_instance.cid | |
# | |
# Example | |
# | |
# # You can also provide a custom key: | |
# class Foo extends Backbone.Model | |
# _.extend this, Singleton("name") | |
# | |
# first_instance = Foo.instance(id: 1, name: "Bar") | |
# second_instance = Foo.instance(id: 2, name: "Bar") | |
# | |
# first_instance.cid == second_instance.cid | |
# | |
# Example | |
# | |
# # You can tell your collections to use singletons by wrapping the | |
# # constructor: | |
# class Foo extends Backbone.Model | |
# _.extend this, Singleton() | |
# | |
# class Foos extends Backbone.Collection | |
# model: (attrs) -> Foo.instance(attrs) | |
# | |
# collection = new Foos([{ id: 1 }, { id: 2 }, { id: 3 }]) | |
# object = Foo.instance(id: 1) | |
# object.cid == collection.first().cid | |
# | |
# Returns an object you can mix into object definitions. | |
@Singleton = (key = "id") -> | |
{ | |
_instances: {} | |
instance: (attrs) -> | |
unless attrs[key] of @_instances | |
@_instances[attrs[key]] = new this(attrs) | |
@_instances[attrs[key]] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment