/**
 * @overview Core.js Module
 * @copyright Dreamlab Onet.pl sp. z. o o 2012
 * @module core
 */


/**
 * @property {Object} cache - cache clients
 */
exports.cache = {};

/**
 * @property {CacheLoader} cache.CacheLoader - cache loader
 */
exports.cache.CacheLoader = require('./cache/CacheLoader.js').CacheLoader;

/**
 * @property {Memcache} cache.Memcache - memcache client
 */
exports.cache.Memcache = require('./cache/Memcache.js').Memcache;


/**
 * @property {Class} Class - class system with great performance
 */
exports.Class = require('./class/Class.js').Class;



/**
 * @property {Object} client - various clients libs
 */
exports.client = {};

/**
 * @property {Memcached} client.Memcached - memcached client
 */
exports.client.Memcached = require('./client/Memcached.js').Memcached;

/**
 * @property {S3} client.S3 - s3 client
 */
exports.client.S3 = require('./client/S3.js').S3;

/**
 * @property {S3} client.S3 - s3 client
 */
exports.client.MySQLPool = require('./client/MySQLPool.js').MySQLPool;

/**
 * @property {PGPool} client.PGPool - PostgreSQL
 */
exports.client.PGPool = require('./client/PGPool.js').PGPool;

/**
 * @property {rabbitmq} client.rabbitmq - RabbitMQ client
 */
exports.client.rabbitmq = require('./client/rabbitmq');

/**
 * @property {Redis} client.Redis - Redis client
 */
exports.client.Redis = require('./client/Redis.js').Redis;


/**
 * @property {Object} common - various common utils
 */
exports.common = {};

/**
 * @property {Object} common.Assertions - assertions
 */
exports.common.Assertions = require('./common/Assertions.js').Assertions;

/**
 * @property {Object} common.Types - types checkers
 */
exports.common.Types = require('./common/Types.js').Types;

/**
 * @property {Object} common.random - random data generators
 */
exports.common.Random = require('./common/Random.js').Random;

/**
 * @property {Object} common.net - network utils
 */
exports.common.Net = require ('./common/Net.js');

/**
 * @property {Object} common.process - system process utils
 */
exports.common.Process = require ('./common/Process.js');

/**
 * @property {Function} common.merge - merge objects
 */
exports.common.Merge = require('./common/Merge.js').Merge;


/**
 * @property {Object} credentials - credentials providers
 */
exports.credentials = {};

/**
 * @property {Function} credentials.CredentialsProvider - merge objects
 */
exports.credentials.CredentialsProvider = require('./credentials/CredentialsProvider.js').CredentialsProvider;

/**
 * @property {Object} crypto - crypto util functions
 */
exports.crypto = require('./crypto/Crypto.js').Crypto;



/**
 * @property {Object} data - data manipulation
 */
exports.data = {};

/**
 * @property {BinaryData} data.BinaryData - binary data wrapper
 */
exports.data.BinaryData = require('./data/BinaryData.js').BinaryData;

/**
 * @property {Compressor} data.Compressor - data compressor
 */
exports.data.Compressor = require('./data/Compressor.js').Compressor;

/**
 * @property {Mime} data.Mime - mime recognition
 */
exports.data.Mime = require('./data/Mime.js').Mime;

/**
 * @property {FormData} data.FormData - http form handling
 */
exports.data.FormData = require('./data/FormData.js').FormData;



/**
 * @property {Object} event - event related package
 */
exports.event = {};

/**
 * @property {Event} event.Event - basic event
 */
exports.event.Event = require('./event/Event.js').Event;

/**
 * @property {ErrorEvent} event.ErrorEvent - error event
 */
exports.event.ErrorEvent = require('./event/ErrorEvent.js').ErrorEvent;

/**
 * @property {EventDispatcher} event.EventDispatcher - event dispacher
 */
exports.event.EventDispatcher = require('./event/EventDispatcher.js').EventDispatcher;


/**
 * @property {Object} http - http networking
 */
exports.http = {};

/**
 * @property {ConnectionPool} http.ConnectionPool - connection pool
 */
exports.http.ConnectionPool = require('./http/ConnectionPool.js').ConnectionPool;

/**
 * @property {Loader} http.Loader - advanced request loader
 */
exports.http.Loader = require('./http/Loader.js').Loader;

/**
 * @property {Message} http.Message - simple http message
 */
exports.http.Message = require('./http/Message.js').Message;

/**
 * @property {Request} http.Request - http request
 */
exports.http.Request = require('./http/Request.js').Request;

/**
 * @property {RequestProcessor} http.RequestProcessor - request processor
 */
exports.http.RequestProcessor = require('./http/RequestProcessor.js').RequestProcessor;

/**
 * @property {Response} http.Response - http response
 */
exports.http.Response = require('./http/Response.js').Response;

/**
 * @property {Server} http.Server - http server
 */
exports.http.Server = require('./http/Server.js').Server;

/**
 * @property {Headers} http.Headers - http headers
 */
exports.http.Headers = require('./http/Headers.js').Headers;



/**
 * @property {Object} jsonrpc - jsonrpc
 */
exports.jsonrpc = {};

/**
 * @property {JsonRpcAbstract} jsonrpc.JsonRpcAbstract - jsonrpc abstract
 */
exports.jsonrpc.JsonRpcAbstract = require('./jsonrpc/JsonRpcAbstract.js').JsonRpcAbstract;

/**
 * @property {JsonRpcError} jsonrpc.JsonRpcError - jsonrpc error
 */
exports.jsonrpc.JsonRpcError = require('./jsonrpc/JsonRpcError.js').JsonRpcError;

/**
 * @property {JsonRpcMethod} jsonrpc.JsonRpcMethod - jsonrpc method
 */
exports.jsonrpc.JsonRpcMethod = require('./jsonrpc/JsonRpcMethod.js').JsonRpcMethod;

/**
 * @property {JsonRpcRequest} jsonrpc.JsonRpcRequest - jsonrpc request
 */
exports.jsonrpc.JsonRpcRequest = require('./jsonrpc/JsonRpcRequest.js').JsonRpcRequest;

/**
 * @property {JsonRpcBatchRequest} jsonrpc.JsonRpcBatchRequest - jsonrpc Batchrequest
 */
exports.jsonrpc.JsonRpcBatchRequest = require('./jsonrpc/JsonRpcBatchRequest.js').JsonRpcBatchRequest;


/**
 * @property {JsonRpcRequestProcessor} jsonrpc.JsonRpcRequestProcessor - jsonrpc request processor
 */
exports.jsonrpc.JsonRpcRequestProcessor = require('./jsonrpc/JsonRpcRequestProcessor.js').JsonRpcRequestProcessor;

/**
 * @property {JsonRpcResponse} jsonrpc.JsonRpcResponse - jsonrpc response
 */
exports.jsonrpc.JsonRpcResponse = require('./jsonrpc/JsonRpcResponse.js').JsonRpcResponse;

/**
 * @property {JsonRpcBatchResponse} jsonrpc.JsonRpcBatchResponse - jsonrpc batchResponse
 */
exports.jsonrpc.JsonRpcBatchResponse = require('./jsonrpc/JsonRpcBatchResponse.js').JsonRpcBatchResponse;


/**
 * @property {JsonRpcServer} jsonrpc.JsonRpcServer - jsonrpc server
 */
exports.jsonrpc.JsonRpcServer = require('./jsonrpc/JsonRpcServer.js').JsonRpcServer;



/**
 * @property {Object} logger - loggers
 */
exports.logger = {};

/**
 * @property {EmptyLogger} logger.EmptyLogger - empty logger
 */
exports.logger.EmptyLogger = require('./logger/EmptyLogger.js').EmptyLogger;

/**
 * @property {WildFireLogger} logger.WildFireLogger - wildfire logger (firephp compatible logging)
 */
exports.logger.WildFireLogger = require('./logger/WildFireLogger.js').WildFireLogger;



/**
 * @property {Object} pattern - patterns implementations
 */
exports.pattern = {};

/**
 * @property {Pool} pattern.Pool - pool pattern
 */
exports.pattern.Pool = require('./pattern/Pool.js').Pool;

/**
 * @property {Object} pattern.decorator - decorator patterns implementations
 */
exports.pattern.decorator = {};

/**
 * @property {AbstractDecorator} pattern.decorator.AbstractDecorator - abstract decorator
 */
exports.pattern.decorator.AbstractDecorator = require('./pattern/decorator/AbstractDecorator.js').AbstractDecorator;

/**
 * @property {DecoratorChain} pattern.decorator.DecoratorChain - decorator chain
 */
exports.pattern.decorator.DecoratorChain = require('./pattern/decorator/DecoratorChain.js').DecoratorChain;


/**
 * @property {Object} util - util tools
 */
exports.util = {};
/**
 * @property {DeviceDetector} util.DeviceDetector - device detector
 */
exports.util.DeviceDetector = require('./util/DeviceDetector.js').DeviceDetector;


/**
 * @property {Object} yaml - yaml
 */
exports.yaml = {};

/**
 * @property {YAML} yaml.YAML - Yaml parser
 */
exports.yaml.YAML = require('./yaml/YAML.js').YAML;
