diff --git a/src/core/Base.js b/src/core/Base.js
index c11782d7..5538f8d8 100644
--- a/src/core/Base.js
+++ b/src/core/Base.js
@@ -16,101 +16,106 @@
 
 // Extend Base with utility functions used across the library.
 Base.inject({
-	statics: true,
 
-	read: function(list, start, length) {
-		var start = start || 0,
-			length = length || list.length - start;
-		var obj = list[start];
-		if (obj instanceof this
-				// If the class defines _readNull, return null when nothing
-				// was provided
-				|| this.prototype._readNull && obj == null && length <= 1)
-			return obj;
-		obj = new this(this.dont);
-		return obj.initialize.apply(obj, start > 0 || length < list.length
-			? Array.prototype.slice.call(list, start, start + length)
-			: list) || obj;
+	clone: function() {
+		return new this.constructor(this);
 	},
 
-	readAll: function(list, start) {
-		var res = [], entry;
-		for (var i = start || 0, l = list.length; i < l; i++) {
-			res.push(Array.isArray(entry = list[i])
-				? this.read(entry, 0)
-				: this.read(list, i, 1));
+	statics: {
+		read: function(list, start, length) {
+			var start = start || 0,
+				length = length || list.length - start;
+			var obj = list[start];
+			if (obj instanceof this
+					// If the class defines _readNull, return null when nothing
+					// was provided
+					|| this.prototype._readNull && obj == null && length <= 1)
+				return obj;
+			obj = new this(this.dont);
+			return obj.initialize.apply(obj, start > 0 || length < list.length
+				? Array.prototype.slice.call(list, start, start + length)
+				: list) || obj;
+		},
+
+		readAll: function(list, start) {
+			var res = [], entry;
+			for (var i = start || 0, l = list.length; i < l; i++) {
+				res.push(Array.isArray(entry = list[i])
+					? this.read(entry, 0)
+					: this.read(list, i, 1));
+			}
+			return res;
+		},
+
+		initialize: function(object, values, defaults) {
+			if (!values)
+				values = defaults;
+			return Base.each(defaults, function(value, key) {
+				this[key] = values[key] || value;
+			}, object);
+		},
+
+		/**
+		 * Utility function for adding and removing items from a list of which
+		 * each entry keeps a reference to its index in the list in the private
+		 * _index property. Used for PaperScope#projects and Item#children.
+		 */
+		splice: function(list, items, index, remove) {
+			var amount = items && items.length,
+				append = index === undefined;
+			index = append ? list.length : index;
+			// Update _index on the items to be added first.
+			for (var i = 0; i < amount; i++)
+				items[i]._index = index + i;
+			if (append) {
+				// Append them all at the end by using push
+				list.push.apply(list, items);
+				// Nothing removed, and nothing to adjust above
+				return [];
+			} else {
+				// Insert somewhere else and/or remove
+				var args = [index, remove];
+				if (items)
+					args.push.apply(args, items);
+				var removed = list.splice.apply(list, args);
+				// Delete the indices of the removed items
+				for (var i = 0, l = removed.length; i < l; i++)
+					delete removed[i]._index;
+				// Adjust the indices of the items above.
+				for (var i = index + amount, l = list.length; i < l; i++)
+					list[i]._index = i;
+				return removed;
+			}
+		},
+
+		capitalize: function(str) {
+			return str.replace(/\b[a-z]/g, function(match) {
+				return match.toUpperCase();
+			});
+		},
+
+		camelize: function(str) {
+			return str.replace(/-(\w)/g, function(all, chr) {
+				return chr.toUpperCase();
+			});
+		},
+
+		/**
+		 * Utility function for rendering numbers to strings at a precision of
+		 * up to 5 fractional digits.
+		 */
+		formatNumber: function(num) {
+			return (Math.round(num * 100000) / 100000).toString();
+		},
+
+		/**
+		 * Utility function for rendering objects to strings, in object literal
+		 * notation.
+		 */
+		formatObject: function(obj) {
+			return '{ ' + Base.each(obj, function(value, key) {
+				this.push(key + ': ' + value);
+			}, []).join(', ') + ' }';
 		}
-		return res;
-	},
-
-	initialize: function(object, values, defaults) {
-		if (!values)
-			values = defaults;
-		return Base.each(defaults, function(value, key) {
-			this[key] = values[key] || value;
-		}, object);
-	},
-
-	/**
-	 * Utility function for adding and removing items from a list of which
-	 * each entry keeps a reference to its index in the list in the private
-	 * _index property. Used for PaperScope#projects and Item#children.
-	 */
-	splice: function(list, items, index, remove) {
-		var amount = items && items.length,
-			append = index === undefined;
-		index = append ? list.length : index;
-		// Update _index on the items to be added first.
-		for (var i = 0; i < amount; i++)
-			items[i]._index = index + i;
-		if (append) {
-			// Append them all at the end by using push
-			list.push.apply(list, items);
-			// Nothing removed, and nothing to adjust above
-			return [];
-		} else {
-			// Insert somewhere else and/or remove
-			var args = [index, remove];
-			if (items)
-				args.push.apply(args, items);
-			var removed = list.splice.apply(list, args);
-			// Delete the indices of the removed items
-			for (var i = 0, l = removed.length; i < l; i++)
-				delete removed[i]._index;
-			// Adjust the indices of the items above.
-			for (var i = index + amount, l = list.length; i < l; i++)
-				list[i]._index = i;
-			return removed;
-		}
-	},
-
-	capitalize: function(str) {
-		return str.replace(/\b[a-z]/g, function(match) {
-			return match.toUpperCase();
-		});
-	},
-
-	camelize: function(str) {
-		return str.replace(/-(\w)/g, function(all, chr) {
-			return chr.toUpperCase();
-		});
-	},
-
-	/**
-	 * Utility function for rendering numbers to strings at a precision of up
-	 * to 5 fractional digits.
-	 */
-	formatNumber: function(num) {
-		return (Math.round(num * 100000) / 100000).toString();
-	},
-
-	/**
-	 * Utility function for rendering objects to strings, in object literal
-	 * notation.
-	 */
-	formatObject: function(obj) {
-		return '{ ' + Base.each(obj, function(value, key) {
-			this.push(key + ': ' + value);
-		}, []).join(', ') + ' }';
 	}
 });