diff --git a/spec/runner.html b/spec/runner.html
new file mode 100644
index 00000000..758c1236
--- /dev/null
+++ b/spec/runner.html
@@ -0,0 +1,28 @@
+
+
+
+ Jasmine Test Runner
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spec/suites/ClassSpec.js b/spec/suites/ClassSpec.js
new file mode 100644
index 00000000..506fda56
--- /dev/null
+++ b/spec/suites/ClassSpec.js
@@ -0,0 +1,27 @@
+describe("Class", function() {
+
+ describe("#extend", function() {
+ var Klass;
+
+ it("should create a class with the given constructor & properties", function() {
+ var constructor = jasmine.createSpy('constructor'),
+ method = jasmine.createSpy('method');
+
+ Klass = L.Class.extend({
+ initialize: constructor,
+ foo: 5,
+ bar: method
+ });
+
+ var a = new Klass();
+
+ expect(constructor).toHaveBeenCalled();
+ expect(a.foo).toEqual(5);
+
+ a.bar();
+
+ expect(method).toHaveBeenCalled();
+ });
+
+ });
+});
\ No newline at end of file
diff --git a/spec/suites/UtilSpec.js b/spec/suites/UtilSpec.js
new file mode 100644
index 00000000..cadf79bb
--- /dev/null
+++ b/spec/suites/UtilSpec.js
@@ -0,0 +1,48 @@
+describe('L.Util', function() {
+
+ describe('#extend', function() {
+ var a;
+
+ beforeEach(function() {
+ a = {
+ foo: 5,
+ bar: 'asd'
+ };
+ });
+
+ it('should extend the first argument with the properties of the second', function() {
+ L.Util.extend(a, {
+ bar: 7,
+ baz: 3
+ });
+
+ expect(a).toEqual({
+ foo: 5,
+ bar: 7,
+ baz: 3
+ });
+ });
+
+ it('should work with more than 2 arguments', function() {
+ L.Util.extend(a, {bar: 7}, {baz: 3});
+
+ expect(a).toEqual({
+ foo: 5,
+ bar: 7,
+ baz: 3
+ });
+ });
+ });
+
+ describe('#bind', function() {
+ it('should return the given function with the given context', function() {
+ var fn = function() {
+ return this;
+ };
+
+ var fn2 = L.Util.bind(fn, 5);
+
+ expect(fn2()).toEqual(5);
+ });
+ });
+});
\ No newline at end of file
diff --git a/src/util/Class.js b/src/util/Class.js
index e49b9cdd..80326aae 100644
--- a/src/util/Class.js
+++ b/src/util/Class.js
@@ -2,9 +2,10 @@
* Class powers the OOP facilities of the library.
*/
-L.Class = function() {};
+L.Class = function() {};
L.Class.extend = function(props) {
+ debugger;
var _super = this.prototype, statics;
// instantiate class without calling constructor
diff --git a/src/util/Util.js b/src/util/Util.js
new file mode 100644
index 00000000..df3232d3
--- /dev/null
+++ b/src/util/Util.js
@@ -0,0 +1,25 @@
+/*
+ L.Util is a namespace for various utility functions.
+*/
+
+L.Util = {};
+
+L.Util.extend = function(dest) { // merge src properties into dest
+ var sources = Array.prototype.slice.call(arguments, 1),
+ src;
+ for (var j = 0, len = sources.length; j < len; j++) {
+ src = sources[j] || {};
+ for (var i in src) {
+ if (src.hasOwnProperty(i)) {
+ dest[i] = src[i];
+ }
+ }
+ }
+ return dest;
+};
+
+L.Util.bind = function(fn, obj) {
+ return function() {
+ return fn.apply(obj, arguments);
+ };
+};
\ No newline at end of file