Source: odin.js

if (typeof(define) !== "function") {
    var define = require("amdefine")(module);
}
define(
    function(require) {
        "use strict";


        var IS_SERVER = !(typeof(window) !== "undefined" && window.document),
            IS_CLIENT = !IS_SERVER,

            defineProperty = Object.defineProperty;


        /**
         * Holds all accessible Classes
         * @class Odin
         */
        function Odin() {

            this.Phys2D = require("odin/phys2d/phys2d");

            this.AudioCtx = require("odin/base/audio_ctx");
            this.Class = require("odin/base/class");
            this.Device = require("odin/base/device");
            this.Dom = require("odin/base/dom");
            this.Enum = require("odin/base/enum");
            this.EventEmitter = require("odin/base/event_emitter");
            this.ObjectPool = require("odin/base/object_pool");
            this.requestAnimationFrame = require("odin/base/request_animation_frame");
            this.io = require("odin/base/socket.io");
            this.Time = require("odin/base/time");
            this.util = require("odin/base/util");

            this.Shader = require("odin/core/assets/shaders/shader");
            this.ShaderLib = require("odin/core/assets/shaders/shader_lib");
            this.Asset = require("odin/core/assets/asset");
            this.AssetLoader = require("odin/core/assets/asset_loader");
            this.Assets = require("odin/core/assets/assets");
            this.AudioClip = require("odin/core/assets/audio_clip");
            this.Bone = require("odin/core/assets/bone");
            this.Material = require("odin/core/assets/material");
            this.Mesh = require("odin/core/assets/mesh");
            this.SpriteSheet = require("odin/core/assets/sprite_sheet");
            this.Texture = require("odin/core/assets/texture");
            this.TextureCube = require("odin/core/assets/texture_cube");

            this.ParticleSystem = require("odin/core/components/particle_system/particle_system");
            this.AudioSource = require("odin/core/components/audio_source");
            this.Camera = require("odin/core/components/camera");
            this.Camera2D = require("odin/core/components/camera_2d");
            this.Component = require("odin/core/components/component");
            this.GUIText = require("odin/core/components/gui_text");
            this.GUITexture = require("odin/core/components/gui_texture");
            this.Light = require("odin/core/components/light");
            this.MeshFilter = require("odin/core/components/mesh_filter");
            this.OrbitControl = require("odin/core/components/orbit_control");
            this.RigidBody2D = require("odin/core/components/rigid_body_2d");
            this.Sprite = require("odin/core/components/sprite");
            this.SpriteAnimation = require("odin/core/components/sprite_animation");
            this.Transform = require("odin/core/components/transform");
            this.Transform2D = require("odin/core/components/transform_2d");

            this.Game = require("odin/core/game/game");
            this.ClientGame = require("odin/core/game/client_game");
            this.Config = require("odin/core/game/config");
            this.Log = require("odin/core/game/log");
            this.BaseGame = require("odin/core/game/base_game");

            this.GUIComponent = require("odin/core/gui/components/gui_component");
            this.GUIContent = require("odin/core/gui/components/gui_content");
            this.GUITransform = require("odin/core/gui/components/gui_transform");

            this.GUI = require("odin/core/gui/gui");
            this.GUIObject = require("odin/core/gui/gui_object");
            this.GUIStyle = require("odin/core/gui/gui_style");
            this.GUIStyleState = require("odin/core/gui/gui_style_state");

            this.Handler = require("odin/core/input/handler");
            this.Input = require("odin/core/input/input");

            this.World = require("odin/core/world/world");
            this.World2D = require("odin/core/world/world_2d");

            this.CanvasRenderer2D = require("odin/core/rendering/canvas_renderer_2d");
            this.WebGLRenderer = require("odin/core/rendering/webgl_renderer");
            this.WebGLRenderer2D = require("odin/core/rendering/webgl_renderer_2d");

            this.Enums = require("odin/core/enums");
            this.GameObject = require("odin/core/game_object");
            this.Prefab = require("odin/core/prefab");
            this.Scene = require("odin/core/scene");

            this.AABB2 = require("odin/math/aabb2");
            this.AABB3 = require("odin/math/aabb3");
            this.Color = require("odin/math/color");
            this.Mat2 = require("odin/math/mat2");
            this.Mat3 = require("odin/math/mat3");
            this.Mat32 = require("odin/math/mat32");
            this.Mat4 = require("odin/math/mat4");
            this.Mathf = require("odin/math/mathf");
            this.Quat = require("odin/math/quat");
            this.Rect = require("odin/math/rect");
            this.RectOffset = require("odin/math/rect_offset");
            this.Vec2 = require("odin/math/vec2");
            this.Vec3 = require("odin/math/vec3");
            this.Vec4 = require("odin/math/vec4");

            if (this.Device.mobile) {
                window.onerror = function(message, page, line) {
                    alert("line: " + line + ", page: " + page + "\nmessage: " + message);
                };
            }
        }


        defineProperty(Odin.prototype, "isServer", {
            get: function() {
                return IS_SERVER;
            }
        });


        defineProperty(Odin.prototype, "isClient", {
            get: function() {
                return IS_CLIENT;
            }
        });


        /**
         * attaches Odin to window/global and all subclasses
         */
        Odin.prototype.globalize = function() {

            for (var key in this) window[key] = this[key];
            window.Odin = this;
        };


        /**
         * test function n number of times returns time it took
         */
        Odin.prototype.test = function(name, fn, times) {
            times || (times = 1000);

            console.time(name);
            while (times--) fn();
            console.timeEnd(name);
        };


        return new Odin;
    }
);