diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 098e018..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2016 phpab
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/README.md b/README.md
deleted file mode 100644
index a4649d7..0000000
--- a/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# phpab.github.io
-
-[](https://travis-ci.org/phpab/phpab.github.io)
-
-The organization website containing the documentation.
diff --git a/composer.json b/composer.json
deleted file mode 100644
index bd320dd..0000000
--- a/composer.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "name": "phpab/phpab.github.io",
- "description": "The websiite of phpab/phpab.",
- "license": "MIT",
- "require": {
- "couscous/couscous": "^1.5"
- }
-}
diff --git a/composer.lock b/composer.lock
deleted file mode 100644
index 9d69651..0000000
--- a/composer.lock
+++ /dev/null
@@ -1,1079 +0,0 @@
-{
- "_readme": [
- "This file locks the dependencies of your project to a known state",
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
- "This file is @generated automatically"
- ],
- "hash": "493b26ae6e23ccc72056045e18c34dbf",
- "content-hash": "fcf905e57914de2a7cbf6d06f81777f5",
- "packages": [
- {
- "name": "container-interop/container-interop",
- "version": "1.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/container-interop/container-interop.git",
- "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/container-interop/container-interop/zipball/fc08354828f8fd3245f77a66b9e23a6bca48297e",
- "reference": "fc08354828f8fd3245f77a66b9e23a6bca48297e",
- "shasum": ""
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Interop\\Container\\": "src/Interop/Container/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
- "time": "2014-12-30 15:22:37"
- },
- {
- "name": "couscous/couscous",
- "version": "1.5.0",
- "source": {
- "type": "git",
- "url": "https://github.com/CouscousPHP/Couscous.git",
- "reference": "b45be656fc8cf1ddf0b58c602783ae62e80c818e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/CouscousPHP/Couscous/zipball/b45be656fc8cf1ddf0b58c602783ae62e80c818e",
- "reference": "b45be656fc8cf1ddf0b58c602783ae62e80c818e",
- "shasum": ""
- },
- "require": {
- "erusev/parsedown": "~1.5",
- "erusev/parsedown-extra": "~0.7",
- "mnapoli/front-yaml": "~1.5",
- "padraic/phar-updater": "^1.0",
- "phine/phar": "~1.0",
- "php": ">=5.4.0",
- "php-di/php-di": "^5.2.1",
- "psr/log": "~1.0",
- "symfony/console": "~2.6",
- "symfony/filesystem": "~2.6",
- "symfony/finder": "~2.6",
- "symfony/process": "~2.6",
- "symfony/yaml": "~2.6",
- "twig/twig": "~1.10"
- },
- "require-dev": {
- "phpunit/phpunit": "~4.5"
- },
- "bin": [
- "bin/couscous"
- ],
- "type": "library",
- "autoload": {
- "psr-4": {
- "Couscous\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "time": "2016-04-03 11:31:43"
- },
- {
- "name": "erusev/parsedown",
- "version": "1.6.0",
- "source": {
- "type": "git",
- "url": "https://github.com/erusev/parsedown.git",
- "reference": "3ebbd730b5c2cf5ce78bc1bf64071407fc6674b7"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/erusev/parsedown/zipball/3ebbd730b5c2cf5ce78bc1bf64071407fc6674b7",
- "reference": "3ebbd730b5c2cf5ce78bc1bf64071407fc6674b7",
- "shasum": ""
- },
- "type": "library",
- "autoload": {
- "psr-0": {
- "Parsedown": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Emanuil Rusev",
- "email": "hello@erusev.com",
- "homepage": "http://erusev.com"
- }
- ],
- "description": "Parser for Markdown.",
- "homepage": "http://parsedown.org",
- "keywords": [
- "markdown",
- "parser"
- ],
- "time": "2015-10-04 16:44:32"
- },
- {
- "name": "erusev/parsedown-extra",
- "version": "0.7.1",
- "source": {
- "type": "git",
- "url": "https://github.com/erusev/parsedown-extra.git",
- "reference": "0db5cce7354e4b76f155d092ab5eb3981c21258c"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/erusev/parsedown-extra/zipball/0db5cce7354e4b76f155d092ab5eb3981c21258c",
- "reference": "0db5cce7354e4b76f155d092ab5eb3981c21258c",
- "shasum": ""
- },
- "require": {
- "erusev/parsedown": "~1.4"
- },
- "type": "library",
- "autoload": {
- "psr-0": {
- "ParsedownExtra": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Emanuil Rusev",
- "email": "hello@erusev.com",
- "homepage": "http://erusev.com"
- }
- ],
- "description": "An extension of Parsedown that adds support for Markdown Extra.",
- "homepage": "https://github.com/erusev/parsedown-extra",
- "keywords": [
- "markdown",
- "markdown extra",
- "parsedown",
- "parser"
- ],
- "time": "2015-11-01 10:19:22"
- },
- {
- "name": "mnapoli/front-yaml",
- "version": "1.5.1",
- "source": {
- "type": "git",
- "url": "https://github.com/mnapoli/FrontYAML.git",
- "reference": "702982070dae3f3635eda4f41ab4725b38a0e63a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/mnapoli/FrontYAML/zipball/702982070dae3f3635eda4f41ab4725b38a0e63a",
- "reference": "702982070dae3f3635eda4f41ab4725b38a0e63a",
- "shasum": ""
- },
- "require": {
- "erusev/parsedown": "~1.0",
- "symfony/yaml": "~2.1|^3.0"
- },
- "require-dev": {
- "league/commonmark": "~0.7",
- "phpunit/phpunit": "~4.5"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Mni\\FrontYAML\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "time": "2016-04-15 11:49:09"
- },
- {
- "name": "padraic/humbug_get_contents",
- "version": "1.0.4",
- "source": {
- "type": "git",
- "url": "https://github.com/padraic/file_get_contents.git",
- "reference": "66797199019d0cb4529cb8d29c6f0b4c5085b53a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/padraic/file_get_contents/zipball/66797199019d0cb4529cb8d29c6f0b4c5085b53a",
- "reference": "66797199019d0cb4529cb8d29c6f0b4c5085b53a",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3"
- },
- "require-dev": {
- "phpunit/phpunit": "~4.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Humbug\\": "src/Humbug/"
- },
- "files": [
- "src/function.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Pádraic Brady",
- "email": "padraic.brady@gmail.com",
- "homepage": "http://blog.astrumfutura.com"
- }
- ],
- "description": "Secure wrapper for accessing HTTPS resources with file_get_contents for PHP 5.3+",
- "homepage": "https://github.com/padraic/file_get_contents",
- "keywords": [
- "download",
- "file_get_contents",
- "http",
- "https",
- "ssl",
- "tls"
- ],
- "time": "2015-04-22 18:45:00"
- },
- {
- "name": "padraic/phar-updater",
- "version": "1.0.3",
- "source": {
- "type": "git",
- "url": "https://github.com/padraic/phar-updater.git",
- "reference": "c17eeb3887dc4269d1b4837dc875d39e9f8149a8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/padraic/phar-updater/zipball/c17eeb3887dc4269d1b4837dc875d39e9f8149a8",
- "reference": "c17eeb3887dc4269d1b4837dc875d39e9f8149a8",
- "shasum": ""
- },
- "require": {
- "padraic/humbug_get_contents": "^1.0",
- "php": ">=5.3.3"
- },
- "require-dev": {
- "phpunit/phpunit": "~4.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Humbug\\SelfUpdate\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Pádraic Brady",
- "email": "padraic.brady@gmail.com",
- "homepage": "http://blog.astrumfutura.com"
- }
- ],
- "description": "A thing to make PHAR self-updating easy and secure.",
- "keywords": [
- "humbug",
- "phar",
- "self-update",
- "update"
- ],
- "time": "2016-01-05 23:08:01"
- },
- {
- "name": "phine/exception",
- "version": "1.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/kherge-abandoned/lib-exception.git",
- "reference": "150c6b6090b2ebc53c60e87cb20c7f1287b7b68a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/kherge-abandoned/lib-exception/zipball/150c6b6090b2ebc53c60e87cb20c7f1287b7b68a",
- "reference": "150c6b6090b2ebc53c60e87cb20c7f1287b7b68a",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
- },
- "require-dev": {
- "league/phpunit-coverage-listener": "~1.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
- "autoload": {
- "psr-0": {
- "Phine\\Exception": "src/lib"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Kevin Herrera",
- "email": "kevin@herrera.io",
- "homepage": "http://kevin.herrera.io"
- }
- ],
- "description": "A PHP library for improving the use of exceptions.",
- "homepage": "https://github.com/phine/lib-exception",
- "keywords": [
- "exception"
- ],
- "time": "2013-08-27 17:43:25"
- },
- {
- "name": "phine/observer",
- "version": "2.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/kherge-abandoned/lib-observer.git",
- "reference": "a3ed2f81c79a056ba1fc4949e03c3e1601665106"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/kherge-abandoned/lib-observer/zipball/a3ed2f81c79a056ba1fc4949e03c3e1601665106",
- "reference": "a3ed2f81c79a056ba1fc4949e03c3e1601665106",
- "shasum": ""
- },
- "require": {
- "phine/exception": "~1.0",
- "php": ">=5.3.9"
- },
- "require-dev": {
- "league/phpunit-coverage-listener": "~1.0",
- "phine/test": "~1.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0-dev"
- }
- },
- "autoload": {
- "psr-0": {
- "Phine\\Observer": "src/lib"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Kevin Herrera",
- "email": "kevin@herrera.io",
- "homepage": "http://kevin.herrera.io"
- }
- ],
- "description": "A PHP library that implements the observer pattern.",
- "homepage": "https://github.com/phine/lib-observer",
- "keywords": [
- "observer"
- ],
- "time": "2013-12-17 23:50:08"
- },
- {
- "name": "phine/path",
- "version": "1.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/box-project/box2-path.git",
- "reference": "cbe1a5eb6cf22958394db2469af9b773508abddd"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/box-project/box2-path/zipball/cbe1a5eb6cf22958394db2469af9b773508abddd",
- "reference": "cbe1a5eb6cf22958394db2469af9b773508abddd",
- "shasum": ""
- },
- "require": {
- "phine/exception": "~1.0",
- "php": ">=5.3.3"
- },
- "require-dev": {
- "league/phpunit-coverage-listener": "~1.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
- "autoload": {
- "psr-0": {
- "Phine\\Path": "src/lib"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Kevin Herrera",
- "email": "kevin@herrera.io",
- "homepage": "http://kevin.herrera.io"
- }
- ],
- "description": "A PHP library for improving the use of file system paths.",
- "homepage": "https://github.com/phine/lib-path",
- "keywords": [
- "file",
- "path",
- "system"
- ],
- "time": "2013-10-15 22:58:04"
- },
- {
- "name": "phine/phar",
- "version": "1.0.2",
- "source": {
- "type": "git",
- "url": "https://github.com/kherge-abandoned/lib-phar.git",
- "reference": "6ba06dcbd094926ebc3be75cbb2067b530c743f5"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/kherge-abandoned/lib-phar/zipball/6ba06dcbd094926ebc3be75cbb2067b530c743f5",
- "reference": "6ba06dcbd094926ebc3be75cbb2067b530c743f5",
- "shasum": ""
- },
- "require": {
- "phine/exception": "~1.0",
- "phine/observer": "~2.0.0",
- "phine/path": "~1.0",
- "php": ">=5.3.3"
- },
- "require-dev": {
- "league/phpunit-coverage-listener": "~1.0",
- "phine/test": "~1.0"
- },
- "suggest": {
- "ext-phar": "For creating PHP archives."
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
- "autoload": {
- "psr-0": {
- "Phine\\Phar": "src/lib"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Kevin Herrera",
- "email": "kevin@herrera.io",
- "homepage": "http://kevin.herrera.io"
- }
- ],
- "description": "A PHP library for creating and reading (without the phar extension) PHP archives.",
- "homepage": "https://github.com/phine/lib-phar",
- "keywords": [
- "phar"
- ],
- "time": "2013-12-18 00:12:41"
- },
- {
- "name": "php-di/invoker",
- "version": "1.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/PHP-DI/Invoker.git",
- "reference": "c5c50237115803d7410d13d9d6afb5afe6526fac"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/c5c50237115803d7410d13d9d6afb5afe6526fac",
- "reference": "c5c50237115803d7410d13d9d6afb5afe6526fac",
- "shasum": ""
- },
- "require": {
- "container-interop/container-interop": "~1.1"
- },
- "require-dev": {
- "athletic/athletic": "~0.1.8",
- "phpunit/phpunit": "~4.5"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Invoker\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Generic and extensible callable invoker",
- "homepage": "https://github.com/PHP-DI/Invoker",
- "keywords": [
- "callable",
- "dependency",
- "dependency-injection",
- "injection",
- "invoke",
- "invoker"
- ],
- "time": "2016-03-20 17:49:41"
- },
- {
- "name": "php-di/php-di",
- "version": "5.2.2",
- "source": {
- "type": "git",
- "url": "https://github.com/PHP-DI/PHP-DI.git",
- "reference": "f574bcc841201ab04587b1c6da1234d4044f67d8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/f574bcc841201ab04587b1c6da1234d4044f67d8",
- "reference": "f574bcc841201ab04587b1c6da1234d4044f67d8",
- "shasum": ""
- },
- "require": {
- "container-interop/container-interop": "~1.0",
- "php": ">=5.4.0",
- "php-di/invoker": "^1.1.1",
- "php-di/phpdoc-reader": "^2.0.1"
- },
- "replace": {
- "mnapoli/php-di": "*"
- },
- "require-dev": {
- "doctrine/annotations": "~1.2",
- "doctrine/cache": "~1.4",
- "mnapoli/phpunit-easymock": "~0.2.0",
- "ocramius/proxy-manager": "~1.0",
- "phpunit/phpunit": "~4.5"
- },
- "suggest": {
- "doctrine/annotations": "Install it if you want to use annotations (version ~1.2)",
- "doctrine/cache": "Install it if you want to use the cache (version ~1.4)",
- "ocramius/proxy-manager": "Install it if you want to use lazy injection (version ~1.0)"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "DI\\": "src/DI/"
- },
- "files": [
- "src/DI/functions.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "The dependency injection container for humans",
- "homepage": "http://php-di.org/",
- "keywords": [
- "container",
- "dependency injection",
- "di"
- ],
- "time": "2016-02-09 22:00:00"
- },
- {
- "name": "php-di/phpdoc-reader",
- "version": "2.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/PHP-DI/PhpDocReader.git",
- "reference": "83f5ead159defccfa8e7092e5b6c1c533b326d68"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/83f5ead159defccfa8e7092e5b6c1c533b326d68",
- "reference": "83f5ead159defccfa8e7092e5b6c1c533b326d68",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "require-dev": {
- "phpunit/phpunit": "~4.6"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "PhpDocReader\\": "src/PhpDocReader"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)",
- "keywords": [
- "phpdoc",
- "reflection"
- ],
- "time": "2015-11-29 10:34:25"
- },
- {
- "name": "psr/log",
- "version": "1.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
- "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
- "shasum": ""
- },
- "type": "library",
- "autoload": {
- "psr-0": {
- "Psr\\Log\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "http://www.php-fig.org/"
- }
- ],
- "description": "Common interface for logging libraries",
- "keywords": [
- "log",
- "psr",
- "psr-3"
- ],
- "time": "2012-12-21 11:40:51"
- },
- {
- "name": "symfony/console",
- "version": "v2.8.4",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/console.git",
- "reference": "9a5aef5fc0d4eff86853d44202b02be8d5a20154"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/9a5aef5fc0d4eff86853d44202b02be8d5a20154",
- "reference": "9a5aef5fc0d4eff86853d44202b02be8d5a20154",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.9",
- "symfony/polyfill-mbstring": "~1.0"
- },
- "require-dev": {
- "psr/log": "~1.0",
- "symfony/event-dispatcher": "~2.1|~3.0.0",
- "symfony/process": "~2.1|~3.0.0"
- },
- "suggest": {
- "psr/log": "For using the console logger",
- "symfony/event-dispatcher": "",
- "symfony/process": ""
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.8-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Console\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony Console Component",
- "homepage": "https://symfony.com",
- "time": "2016-03-17 09:19:04"
- },
- {
- "name": "symfony/filesystem",
- "version": "v2.8.4",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/filesystem.git",
- "reference": "f08ffdf229252cd2745558cb2112df43903bcae4"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/f08ffdf229252cd2745558cb2112df43903bcae4",
- "reference": "f08ffdf229252cd2745558cb2112df43903bcae4",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.9"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.8-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Filesystem\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony Filesystem Component",
- "homepage": "https://symfony.com",
- "time": "2016-03-27 10:20:16"
- },
- {
- "name": "symfony/finder",
- "version": "v2.8.4",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/finder.git",
- "reference": "ca24cf2cd4e3826f571e0067e535758e73807aa1"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/ca24cf2cd4e3826f571e0067e535758e73807aa1",
- "reference": "ca24cf2cd4e3826f571e0067e535758e73807aa1",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.9"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.8-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Finder\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony Finder Component",
- "homepage": "https://symfony.com",
- "time": "2016-03-10 10:53:53"
- },
- {
- "name": "symfony/polyfill-mbstring",
- "version": "v1.1.1",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "1289d16209491b584839022f29257ad859b8532d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/1289d16209491b584839022f29257ad859b8532d",
- "reference": "1289d16209491b584839022f29257ad859b8532d",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
- },
- "suggest": {
- "ext-mbstring": "For best performance"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.1-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
- },
- "files": [
- "bootstrap.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for the Mbstring extension",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "mbstring",
- "polyfill",
- "portable",
- "shim"
- ],
- "time": "2016-01-20 09:13:37"
- },
- {
- "name": "symfony/process",
- "version": "v2.8.4",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/process.git",
- "reference": "fb467471952ef5cf8497c029980e556b47545333"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/fb467471952ef5cf8497c029980e556b47545333",
- "reference": "fb467471952ef5cf8497c029980e556b47545333",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.9"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.8-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Process\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony Process Component",
- "homepage": "https://symfony.com",
- "time": "2016-03-23 13:11:46"
- },
- {
- "name": "symfony/yaml",
- "version": "v2.8.4",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/yaml.git",
- "reference": "584e52cb8f788a887553ba82db6caacb1d6260bb"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/584e52cb8f788a887553ba82db6caacb1d6260bb",
- "reference": "584e52cb8f788a887553ba82db6caacb1d6260bb",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.9"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.8-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Yaml\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony Yaml Component",
- "homepage": "https://symfony.com",
- "time": "2016-03-04 07:54:35"
- },
- {
- "name": "twig/twig",
- "version": "v1.24.0",
- "source": {
- "type": "git",
- "url": "https://github.com/twigphp/Twig.git",
- "reference": "3e5aa30ebfbafd5951fb1b01e338e1800ce7e0e8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/3e5aa30ebfbafd5951fb1b01e338e1800ce7e0e8",
- "reference": "3e5aa30ebfbafd5951fb1b01e338e1800ce7e0e8",
- "shasum": ""
- },
- "require": {
- "php": ">=5.2.7"
- },
- "require-dev": {
- "symfony/debug": "~2.7",
- "symfony/phpunit-bridge": "~2.7"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.24-dev"
- }
- },
- "autoload": {
- "psr-0": {
- "Twig_": "lib/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com",
- "homepage": "http://fabien.potencier.org",
- "role": "Lead Developer"
- },
- {
- "name": "Armin Ronacher",
- "email": "armin.ronacher@active-4.com",
- "role": "Project Founder"
- },
- {
- "name": "Twig Team",
- "homepage": "http://twig.sensiolabs.org/contributors",
- "role": "Contributors"
- }
- ],
- "description": "Twig, the flexible, fast, and secure template language for PHP",
- "homepage": "http://twig.sensiolabs.org",
- "keywords": [
- "templating"
- ],
- "time": "2016-01-25 21:22:18"
- }
- ],
- "packages-dev": [],
- "aliases": [],
- "minimum-stability": "stable",
- "stability-flags": [],
- "prefer-stable": false,
- "prefer-lowest": false,
- "platform": [],
- "platform-dev": []
-}
diff --git a/couscous.yml b/couscous.yml
deleted file mode 100644
index 52ac98b..0000000
--- a/couscous.yml
+++ /dev/null
@@ -1,59 +0,0 @@
-title: PhpAb
-subTitle: The A/B testing framework for PHP
-
-baseUrl: https://phpab.github.io
-
-branch: master
-
-template:
- directory: template
- index: source/index.md
-
-include:
- - source/
-
-exclude:
- - template/
- - vendor/
-
-menu:
- items:
- introduction:
- section: Introduction
- items:
- getting-started:
- text: Getting started
- url: docs/getting-started.html
- library-layout:
- text: Library layout
- url: docs/library-layout.html
- components:
- section: Components
- items:
- analytics:
- text: Analytics
- url: docs/components/analytics.html
- events:
- text: Events
- url: docs/components/events.html
- participation:
- text: Participation
- url: docs/components/participation.html
- storage:
- text: Storage
- url: docs/components/storage.html
- variants:
- text: Variants
- url: docs/components/variants.html
- frameworks:
- section: Frameworks Integrations
- items:
- symfony2:
- text: Symfony 2
- url: docs/frameworks/symfony2.html
- wordpress:
- text: Wordpress
- url: docs/frameworks/wordpress.html
- zf2:
- text: Zend Framework 2
- url: docs/frameworks/zf2.html
diff --git a/template/css/website.css b/css/website.css
similarity index 100%
rename from template/css/website.css
rename to css/website.css
diff --git a/docs/components/analytics.html b/docs/components/analytics.html
new file mode 100644
index 0000000..fda2057
--- /dev/null
+++ b/docs/components/analytics.html
@@ -0,0 +1,492 @@
+
+
+
+
+
+
+
+
+
+
Analytics - The A/B testing framework for PHP.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Analytics
+In order to determine how your tests are doing, you will need to store tests user participation somewhere.
+What you are usually storing is:
+
+- a user identifier
+- a test identifier
+- a variant identifier (this could be control too)
+- a scenario (typically a web url)
+- a timestamp
+
+By analyzing all this data, you can determine which variant is performing better and which one gets users closer to your goals.
+PhpAb provides different ways to store this data.
+You can use more than one Analytics implementation simultaneously too. For instance, you might want to to use Google Analytics and MongoDB, so you could also create your own business intelligence data crunching.
+Google Analytics
+Google Analytics (GA) is a a very powerful tool that can combine website usage with A/B tests (in GA called "Experiments"). Read about how to use Google Analytics Experiments to run your tests.
+Classic or Universal Analytics? It's important that you know which version of Google Analytics your site is using else your data will not be saved.
+Google Classic Analytics
+Use:
+
+PhpAb\Analytics\DataCollector\Google to store user test participations
+PhpAb\Analytics\Renderer\Google\GoogleClassicAnalytics to render in your page the JavaScript required by Google to track participation.
+
+// This illustrates a test with:
+// * Cookie storage
+// * Random Variant Chooser
+// * Simple variants
+// * Google Classic Analytics
+
+use PhpAb\Storage\Cookie;
+use PhpAb\Participation\Manager;
+use PhpAb\Analytics\DataCollector\Google;
+use PhpAb\Event\Dispatcher;
+use PhpAb\Participation\Filter\Percentage;
+use PhpAb\Variant\Chooser\RandomChooser;
+use PhpAb\Engine\Engine;
+use PhpAb\Variant\SimpleVariant;
+use PhpAb\Test\Test;
+use PhpAb\Analytics\Renderer\Google\GoogleClassicAnalytics;
+
+$storage = new Cookie('phpab');
+$manager = new Manager($storage);
+
+$analyticsData = new Google();
+
+$dispatcher = new Dispatcher();
+$dispatcher->addSubscriber($analyticsData);
+
+$filter = new Percentage(100);
+$chooser = new RandomChooser();
+
+$engine = new Engine($manager, $dispatcher, $filter, $chooser);
+
+$test = new Test(
+ 'buttonColour',
+ [],
+ [Google::EXPERIMENT_ID => 'ABC123']
+);
+
+$test->addVariant(new SimpleVariant('control'));
+$test->addVariant(new SimpleVariant('variant'));
+
+$engine->addTest($test);
+$engine->start();
+
+$analytics = new GoogleClassicAnalytics($analyticsData->getTestsData());
+
+// In your views run
+// echo $analytics->getScript()
+
+Google Universal Analytics
+Use:
+
+PhpAb\Analytics\DataCollector\Google to store user test participations
+PhpAb\Analytics\Renderer\Google\GoogleUniversalAnalytics to render in your page the JavaScript required by Google to track participation.
+
+// This illustrates a test with:
+// * Cookie storage
+// * Random Variant Chooser
+// * Simple variants
+// * Google Universal Analytics
+
+use PhpAb\Storage\Cookie;
+use PhpAb\Participation\Manager;
+use PhpAb\Analytics\DataCollector\Google;
+use PhpAb\Event\Dispatcher;
+use PhpAb\Participation\Filter\Percentage;
+use PhpAb\Variant\Chooser\RandomChooser;
+use PhpAb\Engine\Engine;
+use PhpAb\Variant\SimpleVariant;
+use PhpAb\Test\Test;
+use PhpAb\Analytics\Renderer\Google\GoogleUniversalAnalytics;
+
+$storage = new Cookie('phpab');
+$manager = new Manager($storage);
+
+$analyticsData = new Google();
+
+$dispatcher = new Dispatcher();
+$dispatcher->addSubscriber($analyticsData);
+
+$filter = new Percentage(100);
+$chooser = new RandomChooser();
+
+$engine = new Engine($manager, $dispatcher, $filter, $chooser);
+
+$test = new Test(
+ 'buttonColour',
+ [],
+ [Google::EXPERIMENT_ID => 'ABC123']
+);
+
+$test->addVariant(new SimpleVariant('control'));
+$test->addVariant(new SimpleVariant('variant'));
+
+$engine->addTest($test);
+$engine->start();
+
+$analytics = new GoogleUniversalAnalytics($analyticsData->getTestsData());
+
+// In your views run
+// echo $analytics->getScript()
+PDO
+PDO is a Database Abstraction Layer (DBAL) and, as such, allows you to interact with different database services using the same api.
+To store PhpAb test participations using PDO you must:
+Install module
+Due to its requirements, PDO Analytics is shipped as a separate library.
+Install it via composer with:
+$ composer require phpab/analytics-pdo
+Note: Make sure you have installed the database driver you intend to use.
+Usage
+This example uses Sqlite as storage service.
+
+use PhpAb\Storage\Cookie;
+use PhpAb\Participation\Manager;
+use PhpAb\Analytics\DataCollector\Generic;
+use PhpAb\Event\Dispatcher;
+use PhpAb\Participation\Filter\Percentage;
+use PhpAb\Variant\Chooser\RandomChooser;
+use PhpAb\Engine\Engine;
+use PhpAb\Test\Test;
+use PhpAb\Variant\SimpleVariant;
+use PhpAb\Variant\CallbackVariant;
+
+$storage = new Cookie('phpab');
+$manager = new Manager($storage);
+
+$analyticsData = new Generic();
+
+$dispatcher = new Dispatcher();
+$dispatcher->addSubscriber($analyticsData);
+
+$filter = new Percentage(50);
+$chooser = new RandomChooser();
+
+$engine = new Engine($manager, $dispatcher, $filter, $chooser);
+
+$test = new Test('foo_test');
+$test->addVariant(new SimpleVariant('_control'));
+$test->addVariant(new CallbackVariant('v1', function () {
+ echo 'v1';
+}));
+$test->addVariant(new CallbackVariant('v2', function () {
+ echo 'v2';
+}));
+$test->addVariant(new CallbackVariant('v3', function () {
+ echo 'v3';
+}));
+
+// Add some tests
+$engine->addTest($test);
+
+$engine->start();
+
+// Here starts PDO interaction
+$pdo = new PDO('sqlite:./phpab.db');
+
+$options = [
+ 'runTable' => 'Run',
+ 'testIdentifierField' => 'testIdentifier',
+ 'variantIdentifierField' => 'variantIdentifier',
+ 'userIdentifierField' => 'userIdentifier',
+ 'scenarioIdentifierField' => 'scenarioIdentifier',
+ 'runIdentifierField' => 'runIdentifier',
+ 'createdAtField' => 'createdAt'
+];
+
+// Inject PDO instance together with Analytics Data
+$analytics = new \PhpAb\Analytics\PDO(
+ $analyticsData->getTestsData(),
+ $pdo,
+ $options
+);
+
+// Store it providing a user identifier and a scenario
+// typically a URL or a controller name
+
+$analytics->store('1.2.3.4-abc', 'homepage.php');
+The class \PhpAb\Analytics\PDO expects 3 parameters:
+
+- The the participation data array
+- The PDO instance
+- The table and fialds definition (optional)
+
+Once these parameters are passed, execute the store($userIdentifier, $scenarioIdentifier) passing two parameters:
+
+- User identifier, a string that will represent a website visitor. Usually these are stored in a cookie.
+- Scenario identifier, this is typically a url, either a complete one, or a normalized one.
+
+Note: You can check the code and examples at Analytics-PDO.
+MongoDB
+To store PhpAb test participations using MongoDB you must:
+Install module
+Due to its requirements, MongoDB Analytics is shipped as a separate library.
+Install it via composer with:
+$ composer require phpab/analytics-mongodb
+Usage
+use PhpAb\Storage\Cookie;
+use PhpAb\Participation\Manager;
+use PhpAb\Analytics\DataCollector\Generic;
+use PhpAb\Event\Dispatcher;
+use PhpAb\Participation\Filter\Percentage;
+use PhpAb\Variant\Chooser\RandomChooser;
+use PhpAb\Variant\SimpleVariant;
+use PhpAb\Variant\CallbackVariant;
+use PhpAb\Engine\Engine;
+use PhpAb\Test\Test;
+
+$storage = new Cookie('phpab');
+$manager = new Manager($storage);
+
+$analyticsData = new Generic();
+
+$dispatcher = new Dispatcher();
+$dispatcher->addSubscriber($analyticsData);
+
+$filter = new Percentage(50);
+$chooser = new RandomChooser();
+
+$engine = new Engine($manager, $dispatcher, $filter, $chooser);
+
+$test = new Test('foo_test');
+$test->addVariant(new SimpleVariant('_control'));
+$test->addVariant(new CallbackVariant('v1', function () {
+ echo 'v1';
+}));
+$test->addVariant(new CallbackVariant('v2', function () {
+ echo 'v2';
+}));
+$test->addVariant(new CallbackVariant('v3', function () {
+ echo 'v3';
+}));
+
+// Add some tests
+$engine->addTest($test);
+
+$engine->start();
+
+// Here starts MongoDB interaction
+
+// Provide a MongoDB Collection to be injected
+$mongoCollection = (new \MongoDB\Client)->phpab->run;
+
+// Inject together with Analytics Data
+$analytics = new \PhpAb\Analytics\MongoDB(
+ $analyticsData->getTestsData(), $mongoCollection
+);
+
+// Store it providing a user identifier and a scenario
+// typically a URL or a controller name
+
+$result = $analytics->store('1.2.3.4-abc', 'homepage.php');
+The class \PhpAb\Analytics\MongoDB expects 2 parameters:
+
+- The the participation data array
+- The
MongoDB collection name where participation will be stored
+
+Once these parameters are passed, execute the store($userIdentifier, $scenarioIdentifier) passing two parameters:
+
+- User identifier, a string that will represent a website visitor. Usually these are stored in a cookie.
+- Scenario identifier, this is typically a url, either a complete one, or a normalized one.
+
+Note: You can check the code and examples at Analytics-MongoDB.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/components/events.html b/docs/components/events.html
new file mode 100644
index 0000000..9e7e1aa
--- /dev/null
+++ b/docs/components/events.html
@@ -0,0 +1,270 @@
+
+
+
+
+
+
+
+
+
+
Events - The A/B testing framework for PHP.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Events
+Phpab makes use of an event dispatcher. The event dispatcher can be used to attach
+event listeners to so that action can be taken when events happen within the library.
+The library supports multiple implementations of an event dispatcher. By default the
+following implementations exists:
+
+Dispatching
+Simple Dispatcher
+The, what we call, Simple Dispatcher is a dispatcher class that is implemented by
+the PhpAb team itself. It's a very simple implementation to which you add listeners
+and subscribers. When an event is dispatched, the listeners are invoked.
+Usage is simple:
+$dispatcher = new \PhpAb\Event\Dispatcher();
+To add a listener:
+$dispatcher->addListener('my-event', function() {
+ // The callback that is invoked. Parameters depend on the event.
+});
+To add a subscriber:
+// The Google data collector implements SubscriberInterface but
+// of course you can create your own as well.
+$subscriber = new \PhpAb\Analytics\DataCollector\Google();
+$dispatcher->addSubscriber($subscriber);
+Symfony bridge
+The Symfony bridge can be used to create an event dispatcher from the
+symfony/event-dispatcher
+library. It does not have support for
+[SubscriberInterface]()
+at the moment.
+Zend Framework bridge
+The Zend Framwork bridge can be used to create an event dispatcher from the
+zendframework/zend-eventmanager
+library. It does not have support for
+[SubscriberInterface]()
+at the moment.
+Event Types
+Note that all events are dispatched from the Engine class
+(https://github.com/phpab/phpab/blob/master/src/Engine/Engine.php).
+The library has the following events:
+phpab.participation.block
+The phpab.participation.block event is dispatched when a user did not participate
+in the test yet and when the participation manager decided
+that the user should not participate in the particular test.
+phpab.participation.blocked
+The phpab.participation.blocked event is dispatched when the a user already was
+excluded for a test by the participation manager and the
+user visits the page again in a new request.
+phpab.participation.variant_missing
+The phpab.participation.variant_missing event is dispatched when no variant
+has been chosen by the variant chooser or when the variant no
+longer exists. This can happen when the user has a cookie set but the code has
+changed for example.
+phpab.participation.variant_run
+The phpab.participation.variant_run event is dispatched when a variant is
+activated. This will happen for new users as well as for existing users.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/components/google-analytics-experiments/index.html b/docs/components/google-analytics-experiments/index.html
new file mode 100644
index 0000000..369f435
--- /dev/null
+++ b/docs/components/google-analytics-experiments/index.html
@@ -0,0 +1,257 @@
+
+
+
+
+
+
+
+
+
+
Google Analytics Experiments - The A/B testing framework for PHP.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Google Analytics Experiments
+PhpAb supports both Classic Google Analytics Experiments (legacy version) and Universal Analytics Experiments (current version).
+Google provides different ways to interact with it. This refers to the server-side implementation, which means you will have to create the definition of the tests using Google Analytics and implement it in PHP using PhpAb.
+To implement the experiments we assume:
+
+- you are familiar with Google Analytics;
+- you are familiar with Google Analytics Experiments.
+
+If you aren't, worry not, Google provides extensive documentation about how these topics.
+Read more:
+
+Now that you are familiar with it, let's summarize the steps required to use PhpAb with Google Analytics (GA):
+
+- In GA: Integrate Google Analytics tracking
+- In GA: Set the goal your test will try to improve.
+- In GA: Set up an experiments against a goal.
+- In PhpAB: Create tests indicating the Experiment ID provided by GA for the experiment.
+- Run the PhpAb
+- Use GoogleClassicAnalytics or GoogleUniversalAnalytics to render the JavaScript that will let GA know which variant users are expericing.
+
+After that, you will be able to read the result of your tests in GA.
+Note: keep in mind that GA updates experiments data hours later and not in real time.
+Integrate Google Analytics Tracking
+Google Analytics allows you to have insights about your website usage and to perform tests that can alter the behaviour of your website users. All combined in a powerful yet simple interface.
+Follow Google's instructions to set up an account.
+Create goals
+The whole purpose of running tests is to see if a variation performs better than another variation. If it does, adopt it and start again.
+However, "better" might have different meanings. You might want to test the engagement of users, the amount of people that visit a page or, of course, how many buy a product.
+This is why setting your goals is mandatory in Google Analytics.
+Follow up these instructions to set them.
+Set up an experiment
+We strongly recommend you to read the following page before you go any further: https://support.google.com/analytics/answer/1745154.
+It will illustrate what a typical experiment cycle is.
+Once you're familiar with it, you can create experiments using the Content Experiment Interface.
+Pay special attention to the Experiment ID shown in the interface since that will have to be the identifier of the test you create.
+// ...
+$test = new Test(
+ $test1Name,
+ [],
+ [Google::EXPERIMENT_ID => '0OOzcd7jRImEIZuAcSgQmA']
+);
+// ..
+
+Now that you know what GA Experiments are, go to Getting started for how to add tests or to Analytics page for the full Google Analytics implementation.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/components/participation.html b/docs/components/participation.html
new file mode 100644
index 0000000..f045710
--- /dev/null
+++ b/docs/components/participation.html
@@ -0,0 +1,250 @@
+
+
+
+
+
+
+
+
+
+
Participation - The A/B testing framework for PHP.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Participation
+Manager
+The participation manager uses a storage to determine if a user participates in a
+test. You can use the participation manager to determine which variation is chosen
+for a test and if a user is actually participating in a test.
+interface ManagerInterface
+{
+ /**
+ * Gets the variant the user is participating in for the given test.
+ *
+ * @param TestInterface|string $test The identifier of the test to get the variant for.
+ * @return string|null Returns the identifier of the variant or null if not participating.
+ */
+ public function getParticipatingVariant($test);
+
+ /**
+ * Check if the user participates in a test or a specific variant of the test
+ *
+ * @param TestInterface|string $test The identifier of the test to check.
+ * @param VariantInterface|string|null $variant The identifier of the variant to check
+ * @return boolean|string Returns true when the user participates; false otherwise.
+ */
+ public function participates($test, $variant = null);
+
+ /**
+ * Sets the participation to a test with the participation at a specific variant.
+ *
+ * @param TestInterface|string $test The identifier of the test that should be participated.
+ * @param VariantInterface|string|null $variant The identifier of the variant that was chosen or
+ * null if the user does not participate in the test.
+ */
+ public function participate($test, $variant);
+}
+Filters
+Filters are used to determine participation. You can bind filters to tests and you
+can also set a default filter for all tests in the engine. A filter simply returns
+true or false which means the participation state.
+Percentage
+The percentage filter only allows the configured percentage amount of people to
+participate in the test.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/components/storage.html b/docs/components/storage.html
new file mode 100644
index 0000000..6d6ca07
--- /dev/null
+++ b/docs/components/storage.html
@@ -0,0 +1,274 @@
+
+
+
+
+
+
+
+
+
+
Storage and adapters - The A/B testing framework for PHP.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Storage and adapters
+When a user visits the application, the participation manager decides whether or not
+the user will participate in a test. And if so, in which test the user will
+participate. That choice will be remembered so that the user will have the same
+experience even when the page is reloaded.
+In order to remember that choice PhpAb make use of storage providers. You can
+configure the library to use a specific storage adapter.
+Cookie
+The Cookie storage provider saves the tests and variants in which the user
+participates, in a cookie. Only one cookie is used and you can configure the name
+and lifetime of it.
+Usage
+use PhpAb\Storage\Adapter\Cookie;
+use PhpAb\Storage\Storage;
+use PhpAb\Participation\Manager;
+
+// Create a Storage and its Adapter
+$adapter = new Cookie('phpab');
+$storage = new Storage($adapter);
+
+// Create a Participation Manager
+$manager = new Manager($storage);
+
+//...
+Decide the name and the ttl of the cookie:
+$nameOfCookie = 'myCookie';
+$ttl = 86400; // in seconds
+$adapter = new Cookie($nameOfCookie, $ttl);
+Session
+Installation
+This implements Aura Sessions library, reason which it must be include as external dependency.
+To add it simply use composer as:
+composer require phpab/storage-aurasession
+Usage
+use PhpAb\Storage\Adapter\AuraSession;
+use PhpAb\Storage\Storage;
+use PhpAb\Participation\Manager;
+
+// Create a Storage and its Adapter
+$adapter = new AuraSession();
+$storage = new Storage($adapter);
+
+// Create a Participation Manager
+$manager = new Manager($storage);
+
+//...
+The AuraSession storage provider remembers the choices just for the current session. When a new session
+is generated, the choices of the tests are cleared and phpab will re-evaluate if the user should participate.
+Runtime
+The Runtime storage provider remembers the choices only for the current request. It
+could be useful to use this provider for testing or development. In production you
+should avoid this storage provider.
+use PhpAb\Storage\Adapter\Runtime;
+use PhpAb\Storage\Storage;
+use PhpAb\Participation\Manager;
+
+// Create a Storage and its Adapter
+$adapter = new Runtime();
+$storage = new Storage($adapter);
+
+// Create a Participation Manager
+$manager = new Manager($storage);
+
+//...
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/components/variants.html b/docs/components/variants.html
new file mode 100644
index 0000000..614c25a
--- /dev/null
+++ b/docs/components/variants.html
@@ -0,0 +1,253 @@
+
+
+
+
+
+
+
+
+
+
Variants - The A/B testing framework for PHP.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Variants
+Types
+Simple
+The simple variant type has no extra logic. It's simply activated and the name is
+stored in the storage.
+$test = new \PhpAb\Test\Test('foo_test');
+$test->addVariant(new \PhpAb\Variant\SimpleVariant('_control'));
+Callback
+When the callback variant is activated, it will trigger a callback function. You can
+execute logic at that moment.
+$test = new \PhpAb\Test\Test('foo_test');
+$test->addVariant(new \PhpAb\Variant\CallbackVariant('_control', function () {
+ echo '_control';
+}));
+$test->addVariant(new \PhpAb\Variant\CallbackVariant('v2', function () {
+ echo 'v2';
+}));
+Custom Type
+A custom variant type can easily be created by implementing PhpAb\Variant\VariantInterface
+Choosers
+How a variant is chosen depends on the variant chooser that has been set for a test.
+We support two variant choosers out of the box.
+Static
+A static chooser has a predefined choice set. Simply pass the index of the variant of
+choice to the constructor.
+Random
+The random variant chooser picks a random (like the name says) variant from the given
+list of variants.
+Custom
+To create your own variant chooser, create a class that implements PhpAb\Variant\Chooser\ChooserInterface.
+<?php
+
+namespace Awesome;
+
+use PhpAb\Variant\Chooser\ChooserInterface;
+
+class AlwaysFirstVariant implements ChooserInterface
+ {
+ public function chooseVariant($variants)
+ {
+ return $variants[0];
+ }
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/frameworks/symfony2.html b/docs/frameworks/symfony2.html
new file mode 100644
index 0000000..b9a1e04
--- /dev/null
+++ b/docs/frameworks/symfony2.html
@@ -0,0 +1,214 @@
+
+
+
+
+
+
+
+
+
+
Symfony 2 - The A/B testing framework for PHP.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Symfony 2
+Support for Symfony 2 is planned but not yet started. Have a look at
+issue #69 to keep up-to-date with the
+latest changes.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/frameworks/wordpress.html b/docs/frameworks/wordpress.html
new file mode 100644
index 0000000..3662ec0
--- /dev/null
+++ b/docs/frameworks/wordpress.html
@@ -0,0 +1,214 @@
+
+
+
+
+
+
+
+
+
+
Wordpress - The A/B testing framework for PHP.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Wordpress
+Support for Wordpress is planned but not yet started. Have a look at
+issue #68 to keep up-to-date with the
+latest changes.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/frameworks/zf2.html b/docs/frameworks/zf2.html
new file mode 100644
index 0000000..a30cfdd
--- /dev/null
+++ b/docs/frameworks/zf2.html
@@ -0,0 +1,359 @@
+
+
+
+
+
+
+
+
+
+
Zend Framework 2 - The A/B testing framework for PHP.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Zend Framework 2
+We have implemented a module which you can hook into your Zend Framework 2 application.
+This module basically wraps the phpab/phpab library
+and adds some additional functionality which makes it possible to fully integrate the
+library into your application while keeping support for all ZF2 functionality.
+Installation
+Simply install the module using Composer:
+composer require phpab/phpab-module
+Next make sure the module is actually loaded by adding PhpAbModule to application
+config in config/application.config.php.
+Installation without Composer is not officially supported.
+Configuration
+Copy over the dist configuration file that is provided in the module.
+cp vendor/phpab/phpab-module/config/phpab.global.php.dist config/autoload/phpab.global.php
+You can edit this file to your needs.
+Configuration Options
+['phpab']['analytics_collector']
+The name of the service that loads the data collector. A data collector collects
+information about which tests and variants are started for a user.
+The default value is phpab.default_analytics_collector. You can either change
+this value or change the service that gets loaded in the service manager.
+['phpab']['analytics_handler']
+The name of the service that loads the analytics handler. A handler uses the
+collected data and writes it away.
+The default value is phpab.default_analytics_handler. You can either change
+this value or change the service that gets loaded in the service manager.
+['phpab']['default_filter']
+When creating tests, you pass a filter which decides if a user should participate.
+When no filter is passed to tests, the default filter is used. That default filter
+can be configured with this configuration option.
+This is the name of the service that loads the default filter. The default value is
+phpab.default_filter. You can either change this value or change the service that
+gets loaded in the service manager.
+['phpab']['default_variant_chooser']
+Like with the ['phpab']['default_filter'] option, the same applies for default
+variant chooser.
+This is the name of the service that loads the default filter. The default value is
+phpab.default_filter. You can either change this value or change the service that
+gets loaded in the service manager.
+['phpab']['storage']
+The storage type to use. Supported values are:
+
+cookie: Stores the participations in a cookie;
+runtime: Stores the participations only for the current request;
+session: Stores the participations in a session.
+
+['phpab']['storage_options']
+An array with options for the storage type. Different options are required per
+storage type:
+Cookie
+
+name: The name of the cookie. This value is required.
+ttl: The lifetime of the cookie in seconds. This value is required.
+
+Runtime
+This storage has no options.
+Session
+
+name: The name of the session. This value is required.
+
+['phpab']['tests']
+This is a map with tests that exist within the application. The key of each element
+represents the name of the test. The value should be an array with options. A test
+has the following options:
+
+filter: The name of the service that loads the participation filter.
+variant_chooser: The name of the service that loads the variant chooser.
+variants: A map with variants that can be chosen from.
+
+The filter and variant_chooser work the same as the default filter and default
+variant chooser.
+The map with variants is an array where each key represents the name of the variant.
+The value of the variant is an array with variant options. Each variant can have
+one of the following options:
+
+type: The type of the variant.
+options: An array with options for the variant type.
+
+Variants
+The module supports the following variant types:
+Callback
+The callback variant will invoke a callback when activated. It has one required option
+called callback:
+'my-variant' => [
+ 'type' => 'callback',
+ 'options' => [
+ 'callback' => function() {
+ },
+ ],
+],
+Event Manager
+The event manager variant will attach a listener to an event manager when executed.
+Since the phpab engine is started at the startup of the application, you can listen
+to every event.
+'my-variant' => [
+ 'type' => 'event_manager',
+ 'options' => [
+ 'event_manager' => 'my_event_manager',
+ 'event' => 'my_event',
+ 'priority' => 100,
+ 'callback' => function() {
+ },
+ ],
+],
+Only the event and the callback options are required. When no event_manager
+option is provided, the event manager from the application is used. The default value
+for the priority option is 0.
+When the callback is a string and is not a callable function, it will be loaded
+from the service manager. In other words, you can specify a valid service name as
+well.
+Simple
+The simple variant will note execute any further logic when activated.
+'my-variant' => [
+ 'type' => 'simple',
+],
+Service Manager
+The service manager variant is a fallback variant. When the type is not known, it will
+try to load the variant from the service manager with the type as the service name.
+'my-variant' => [
+ 'type' => 'my_service_name',
+],
+Alternatively you can specify the service name straight away like this:
+'my-variant' => 'my_service_name',
+Configuration Example
+<?php
+return [
+ 'phpab' => [
+ 'storage' => 'cookie',
+ 'storage_options' => [
+ 'name' => 'phpab',
+ 'ttl' => 3600,
+ ],
+ 'tests' => [
+ 'button-test' => [
+ 'filter' => 'phpab.default_filter',
+ 'variant_chooser' => 'phpab.default_variant_chooser',
+ 'variants' => [
+ '_control' => [
+ 'type' => 'simple',
+ ],
+ 'alternative' => [
+ 'type' => 'simple'
+ ],
+ ],
+ ],
+ ],
+ ],
+];
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/getting-started.html b/docs/getting-started.html
new file mode 100644
index 0000000..36feba8
--- /dev/null
+++ b/docs/getting-started.html
@@ -0,0 +1,262 @@
+
+
+
+
+
+
+
+
+
+
Getting started - The A/B testing framework for PHP.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Getting started with PhpAb
+Hello world! This guide will help you get started with using php in your project.
+Before you start using phpab/phpab, you need to know what A/B testing is. If you are new to
+A/B testing we recommend you read the documentation index where we explain the basics of A/B testing
+especially for you: Understanding A/B testing.
+Installation
+The recommended way of installing phpab/phpab is via Composer.
+composer require phpab/phpab
+Basic usage
+1. Participation and Storage
+It's common to only run tests for a selected group of people. This can be done using a participation
+manager. When tests are activated, we need to store the choice that has been made for the user. This
+is done using a storage type. In this case we use cookies.
+$storage = new \PhpAb\Storage\Cookie('phpab');
+$participationManager = new \PhpAb\Participation\Manager($storage);
+We have implemented several storage types, you can read more about them here.
+2. Analytics Collecting
+It makes no sense to run tests without analyzing the results. A common way is to use Google Analytics to
+meassure what tests are used. Phpab makes used of data collectors to collect the started tests.
+$analyticsData = new \PhpAb\Analytics\Google\DataCollector();
+3. Events
+An event dispatcher must be created which is used later on. This event dispatcher can be used to hook
+into the API and listen to tests. The analytics data collector should be attached to the event dispatcher
+so that it registers statistics about the tests.
+$dispatcher = new \PhpAb\Event\Dispatcher();
+$dispatcher->addSubscriber($analyticsData);
+4. Engine
+The engine is used to run tests. You can pass along a default variant chooser and participation filter
+here as well. More about that later on.
+$filter = new \PhpAb\Participation\PercentageFilter(50);
+$chooser = new \PhpAb\Variant\RandomChooser();
+$engine = new PhpAb\Engine\Engine($participationManager, $dispatcher, $filter, $chooser);
+5. Adding Tests
+Adding a test is simple,
+$test = new \PhpAb\Test\Test('foo_test');
+$test->addVariant(new \PhpAb\Variant\SimpleVariant('_control'));
+$test->addVariant(new \PhpAb\Variant\CallbackVariant('v1', function () {
+ echo 'v1';
+}));
+$test->addVariant(new \PhpAb\Variant\CallbackVariant('v2', function () {
+ echo 'v2';
+}));
+$test->addVariant(new \PhpAb\Variant\CallbackVariant('v3', function () {
+ echo 'v3';
+}));
+
+$engine->addTest($test);
+6. Start your engines
+The last step is to start the engine and render the Google Analytics script.
+$engine->start();
+$analytics = new \PhpAb\Analytics\Renderer\GoogleUniversalAnalytics($analyticsData->getTestsData());
+echo $analytics->getScript();
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 0000000..808669d
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,242 @@
+
+
+
+
+
+
+
+
+
+
Documentation index - The A/B testing framework for PHP.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Documentation
+This is the documentation index. In this documentation we will explain the usage
+of PhpAb. We will describe design of the library and all the components it exists
+of.
+Before you go into depth it's important to realize what A/B testing is and how it
+works.
+Understanding A/B testing
+A/B testing, sometimes also called bucket tests or split-run testing, is a way
+to run an experiment with two variants, A and B. A and B are also called the
+control and the variation.
+The goal is two run an experiment and analyze with variation has an outcome that
+meets the requirements most. Requirements can variate a lot and totally depend on
+the business case. One could use A/B testing for user experience for example. But
+one could also apply A/B testing to technical problems to see which version of an
+application performs better for example.
+Multivariate testing
+Multivariate testing is very similar to A/B testing with a difference that one
+runs multiple variants in an experiment. This library also supports multivariate
+testing.
+References
+For more information on A/B testing, Google is your best friend. We've made a
+selection of some useful websites that you can visit.
+
+License
+PhpAb is released under the MIT license.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/library-layout.html b/docs/library-layout.html
new file mode 100644
index 0000000..6a15b07
--- /dev/null
+++ b/docs/library-layout.html
@@ -0,0 +1,248 @@
+
+
+
+
+
+
+
+
+
+
Library Layout - The A/B testing framework for PHP.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Library layout
+In this document the layout of the library is described. It's good to understand this
+layout if you want to extend the library or introduce new features.
+Engine
+The most important component is the Engine. An instance of Engine will control all
+your tests. Generally you would only have one instance of this Engine. The engine
+should be started using the Engine::start method. By starting the engine, the
+tests and their variants are activated. Some variants contain a callback method
+which can contain code hook into your application. It's very important to realize
+that starting this engine should happen as early as possible for this reason.
+Analytics
+The analytics component collects the data about started tests and variants. This is
+needed in order to handle this later on. Depending on your prefered analytics type,
+the data is handled differently. For example when using Google Analytics, you need
+to embed a JavaScript in your application in order to send the collected data to
+Google. In case of PDO analytics the data needs to be written to a database and there
+is nothing to render.
+This library does not provide a way to analyze the collected data. It only registers
+the data. It's up to user-domain to interpret the data and analyze it.
+Events
+PhpAb provides an event dispatcher which makes it possible to add hooks to the
+system. We provide various immplementations for event managers. There is a simple
+event dispatcher but there is also support to use the Symfony Event dispatcher or
+Zend Framework 2's event manager.
+Participation
+In order to decide if users should participate, we have created a participation
+manager. This participation manager makes use of filters in order to decide if a
+user is included in a test.
+Storage
+When a test has been activated, the actiavated test should be remembered. You don't
+want to see version A of your application during a first request and a version B
+when you visit a different page. In order to preserve the selected choice, we use a
+storage provider to remember your choice. The most common storage is probably a
+cookie storage but there are alternatives.
+Variants
+Variants represent the choice that is made for a test. It's possible to run
+additional code when a variation is activated. This way it becomes possible to change
+certain parts of your application depending on the variant that is chosen.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/template/favicon.ico b/favicon.ico
similarity index 100%
rename from template/favicon.ico
rename to favicon.ico
diff --git a/template/img/analytics/google-analytics.png b/img/analytics/google-analytics.png
similarity index 100%
rename from template/img/analytics/google-analytics.png
rename to img/analytics/google-analytics.png
diff --git a/template/img/analytics/mongodb.png b/img/analytics/mongodb.png
similarity index 100%
rename from template/img/analytics/mongodb.png
rename to img/analytics/mongodb.png
diff --git a/template/img/analytics/mysql.png b/img/analytics/mysql.png
similarity index 100%
rename from template/img/analytics/mysql.png
rename to img/analytics/mysql.png
diff --git a/template/img/analytics/postgresql.png b/img/analytics/postgresql.png
similarity index 100%
rename from template/img/analytics/postgresql.png
rename to img/analytics/postgresql.png
diff --git a/template/img/create-experiments-interface.png b/img/create-experiments-interface.png
similarity index 100%
rename from template/img/create-experiments-interface.png
rename to img/create-experiments-interface.png
diff --git a/template/img/frameworks/silex.png b/img/frameworks/silex.png
similarity index 100%
rename from template/img/frameworks/silex.png
rename to img/frameworks/silex.png
diff --git a/template/img/frameworks/slim.png b/img/frameworks/slim.png
similarity index 100%
rename from template/img/frameworks/slim.png
rename to img/frameworks/slim.png
diff --git a/template/img/frameworks/symfony2.png b/img/frameworks/symfony2.png
similarity index 100%
rename from template/img/frameworks/symfony2.png
rename to img/frameworks/symfony2.png
diff --git a/template/img/frameworks/wordpress.png b/img/frameworks/wordpress.png
similarity index 100%
rename from template/img/frameworks/wordpress.png
rename to img/frameworks/wordpress.png
diff --git a/template/img/frameworks/zf2.png b/img/frameworks/zf2.png
similarity index 100%
rename from template/img/frameworks/zf2.png
rename to img/frameworks/zf2.png
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..86f9168
--- /dev/null
+++ b/index.html
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
+
+
+
PhpAb - The A/B testing framework for PHP.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Integrations
+
+
+
+ PhpAb nicely integrates with the following frameworks.
+
+
+
+
+
+
+
+
+
+ Analytics
+
+
+
+ You choose where to you store analytics of your tests.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/source/404.md b/source/404.md
deleted file mode 100644
index 39c453f..0000000
--- a/source/404.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-title: Page not found
-layout: 404
----
diff --git a/source/docs/components/analytics.md b/source/docs/components/analytics.md
deleted file mode 100644
index 5f7a9b9..0000000
--- a/source/docs/components/analytics.md
+++ /dev/null
@@ -1,320 +0,0 @@
----
-layout: documentation
-title: Analytics
----
-
-# Analytics
-
-In order to determine how your tests are doing, you will need to store tests user participation somewhere.
-What you are usually storing is:
-
-* a user identifier
-* a test identifier
-* a variant identifier (this could be control too)
-* a scenario (typically a web url)
-* a timestamp
-
-By analyzing all this data, you can determine which variant is performing better and which one gets users closer to your goals.
-
-PhpAb provides different ways to store this data.
-You can use more than one Analytics implementation simultaneously too. For instance, you might want to to use Google Analytics and MongoDB, so you could also create your own business intelligence data crunching.
-
-## Google Analytics
-
-Google Analytics (GA) is a a very powerful tool that can combine website usage with A/B tests (in GA called "Experiments"). Read about [how to use Google Analytics Experiments](google-analytics-experiments/index.md) to run your tests.
-
-**Classic or Universal Analytics?** It's important that you know which version of Google Analytics your site is using else your data will not be saved.
-
-### Google Classic Analytics
-
-Use:
-* `PhpAb\Analytics\DataCollector\Google` to store user test participations
-* `PhpAb\Analytics\Renderer\Google\GoogleClassicAnalytics` to render in your page the JavaScript required by Google to track participation.
-
-```php
-// This illustrates a test with:
-// * Cookie storage
-// * Random Variant Chooser
-// * Simple variants
-// * Google Classic Analytics
-
-use PhpAb\Storage\Cookie;
-use PhpAb\Participation\Manager;
-use PhpAb\Analytics\DataCollector\Google;
-use PhpAb\Event\Dispatcher;
-use PhpAb\Participation\Filter\Percentage;
-use PhpAb\Variant\Chooser\RandomChooser;
-use PhpAb\Engine\Engine;
-use PhpAb\Variant\SimpleVariant;
-use PhpAb\Test\Test;
-use PhpAb\Analytics\Renderer\Google\GoogleClassicAnalytics;
-
-$storage = new Cookie('phpab');
-$manager = new Manager($storage);
-
-$analyticsData = new Google();
-
-$dispatcher = new Dispatcher();
-$dispatcher->addSubscriber($analyticsData);
-
-$filter = new Percentage(100);
-$chooser = new RandomChooser();
-
-$engine = new Engine($manager, $dispatcher, $filter, $chooser);
-
-$test = new Test(
- 'buttonColour',
- [],
- [Google::EXPERIMENT_ID => 'ABC123']
-);
-
-$test->addVariant(new SimpleVariant('control'));
-$test->addVariant(new SimpleVariant('variant'));
-
-$engine->addTest($test);
-$engine->start();
-
-$analytics = new GoogleClassicAnalytics($analyticsData->getTestsData());
-
-// In your views run
-// echo $analytics->getScript()
-
-```
-
-### Google Universal Analytics
-
-Use:
-* `PhpAb\Analytics\DataCollector\Google` to store user test participations
-* `PhpAb\Analytics\Renderer\Google\GoogleUniversalAnalytics` to render in your page the JavaScript required by Google to track participation.
-
-
-```php
-// This illustrates a test with:
-// * Cookie storage
-// * Random Variant Chooser
-// * Simple variants
-// * Google Universal Analytics
-
-use PhpAb\Storage\Cookie;
-use PhpAb\Participation\Manager;
-use PhpAb\Analytics\DataCollector\Google;
-use PhpAb\Event\Dispatcher;
-use PhpAb\Participation\Filter\Percentage;
-use PhpAb\Variant\Chooser\RandomChooser;
-use PhpAb\Engine\Engine;
-use PhpAb\Variant\SimpleVariant;
-use PhpAb\Test\Test;
-use PhpAb\Analytics\Renderer\Google\GoogleUniversalAnalytics;
-
-$storage = new Cookie('phpab');
-$manager = new Manager($storage);
-
-$analyticsData = new Google();
-
-$dispatcher = new Dispatcher();
-$dispatcher->addSubscriber($analyticsData);
-
-$filter = new Percentage(100);
-$chooser = new RandomChooser();
-
-$engine = new Engine($manager, $dispatcher, $filter, $chooser);
-
-$test = new Test(
- 'buttonColour',
- [],
- [Google::EXPERIMENT_ID => 'ABC123']
-);
-
-$test->addVariant(new SimpleVariant('control'));
-$test->addVariant(new SimpleVariant('variant'));
-
-$engine->addTest($test);
-$engine->start();
-
-$analytics = new GoogleUniversalAnalytics($analyticsData->getTestsData());
-
-// In your views run
-// echo $analytics->getScript()
-```
-
-## PDO
-
-PDO is a Database Abstraction Layer (DBAL) and, as such, allows you to interact with different database services using the same api.
-To store PhpAb test participations using PDO you must:
-
-### Install module
-Due to its requirements, PDO Analytics is shipped as a separate library.
-Install it via composer with:
-
-```bash
-$ composer require phpab/analytics-pdo
-```
-**Note:** Make sure you have installed the database driver you intend to use.
-
-### Usage
-
-This example uses `Sqlite` as storage service.
-
-```php
-
-use PhpAb\Storage\Cookie;
-use PhpAb\Participation\Manager;
-use PhpAb\Analytics\DataCollector\Generic;
-use PhpAb\Event\Dispatcher;
-use PhpAb\Participation\Filter\Percentage;
-use PhpAb\Variant\Chooser\RandomChooser;
-use PhpAb\Engine\Engine;
-use PhpAb\Test\Test;
-use PhpAb\Variant\SimpleVariant;
-use PhpAb\Variant\CallbackVariant;
-
-$storage = new Cookie('phpab');
-$manager = new Manager($storage);
-
-$analyticsData = new Generic();
-
-$dispatcher = new Dispatcher();
-$dispatcher->addSubscriber($analyticsData);
-
-$filter = new Percentage(50);
-$chooser = new RandomChooser();
-
-$engine = new Engine($manager, $dispatcher, $filter, $chooser);
-
-$test = new Test('foo_test');
-$test->addVariant(new SimpleVariant('_control'));
-$test->addVariant(new CallbackVariant('v1', function () {
- echo 'v1';
-}));
-$test->addVariant(new CallbackVariant('v2', function () {
- echo 'v2';
-}));
-$test->addVariant(new CallbackVariant('v3', function () {
- echo 'v3';
-}));
-
-// Add some tests
-$engine->addTest($test);
-
-$engine->start();
-
-// Here starts PDO interaction
-$pdo = new PDO('sqlite:./phpab.db');
-
-$options = [
- 'runTable' => 'Run',
- 'testIdentifierField' => 'testIdentifier',
- 'variantIdentifierField' => 'variantIdentifier',
- 'userIdentifierField' => 'userIdentifier',
- 'scenarioIdentifierField' => 'scenarioIdentifier',
- 'runIdentifierField' => 'runIdentifier',
- 'createdAtField' => 'createdAt'
-];
-
-// Inject PDO instance together with Analytics Data
-$analytics = new \PhpAb\Analytics\PDO(
- $analyticsData->getTestsData(),
- $pdo,
- $options
-);
-
-// Store it providing a user identifier and a scenario
-// typically a URL or a controller name
-
-$analytics->store('1.2.3.4-abc', 'homepage.php');
-```
-
-The class `\PhpAb\Analytics\PDO` expects 3 parameters:
-* The the participation data array
-* The PDO instance
-* The table and fialds definition (optional)
-
-Once these parameters are passed, execute the `store($userIdentifier, $scenarioIdentifier)` passing two parameters:
-* User identifier, a string that will represent a website visitor. Usually these are stored in a cookie.
-* Scenario identifier, this is typically a url, either a complete one, or a normalized one.
-
-Note: You can check the code and examples at [Analytics-PDO](https://github.com/phpab/analytics-pdo).
-
-## MongoDB
-
-To store PhpAb test participations using `MongoDB` you must:
-
-### Install module
-Due to its requirements, MongoDB Analytics is shipped as a separate library.
-Install it via composer with:
-
-```bash
-$ composer require phpab/analytics-mongodb
-```
-
-### Usage
-
-```php
-use PhpAb\Storage\Cookie;
-use PhpAb\Participation\Manager;
-use PhpAb\Analytics\DataCollector\Generic;
-use PhpAb\Event\Dispatcher;
-use PhpAb\Participation\Filter\Percentage;
-use PhpAb\Variant\Chooser\RandomChooser;
-use PhpAb\Variant\SimpleVariant;
-use PhpAb\Variant\CallbackVariant;
-use PhpAb\Engine\Engine;
-use PhpAb\Test\Test;
-
-$storage = new Cookie('phpab');
-$manager = new Manager($storage);
-
-$analyticsData = new Generic();
-
-$dispatcher = new Dispatcher();
-$dispatcher->addSubscriber($analyticsData);
-
-$filter = new Percentage(50);
-$chooser = new RandomChooser();
-
-$engine = new Engine($manager, $dispatcher, $filter, $chooser);
-
-$test = new Test('foo_test');
-$test->addVariant(new SimpleVariant('_control'));
-$test->addVariant(new CallbackVariant('v1', function () {
- echo 'v1';
-}));
-$test->addVariant(new CallbackVariant('v2', function () {
- echo 'v2';
-}));
-$test->addVariant(new CallbackVariant('v3', function () {
- echo 'v3';
-}));
-
-// Add some tests
-$engine->addTest($test);
-
-$engine->start();
-
-// Here starts MongoDB interaction
-
-// Provide a MongoDB Collection to be injected
-$mongoCollection = (new \MongoDB\Client)->phpab->run;
-
-// Inject together with Analytics Data
-$analytics = new \PhpAb\Analytics\MongoDB(
- $analyticsData->getTestsData(), $mongoCollection
-);
-
-// Store it providing a user identifier and a scenario
-// typically a URL or a controller name
-
-$result = $analytics->store('1.2.3.4-abc', 'homepage.php');
-```
-
-The class `\PhpAb\Analytics\MongoDB` expects 2 parameters:
-* The the participation data array
-* The `MongoDB` collection name where participation will be stored
-
-Once these parameters are passed, execute the `store($userIdentifier, $scenarioIdentifier)` passing two parameters:
-* User identifier, a string that will represent a website visitor. Usually these are stored in a cookie.
-* Scenario identifier, this is typically a url, either a complete one, or a normalized one.
-
-Note: You can check the code and examples at [Analytics-MongoDB](https://github.com/phpab/analytics-mongodb).
-
-
diff --git a/source/docs/components/events.md b/source/docs/components/events.md
deleted file mode 100644
index e358525..0000000
--- a/source/docs/components/events.md
+++ /dev/null
@@ -1,94 +0,0 @@
----
-layout: documentation
-title: Events
----
-
-# Events
-
-Phpab makes use of an event dispatcher. The event dispatcher can be used to attach
-event listeners to so that action can be taken when events happen within the library.
-
-The library supports multiple implementations of an event dispatcher. By default the
-following implementations exists:
-- Default dispatcher: An event dispatcher composed by the phpab team;
-- Symfony dispatcher: This event dispatcher makes use of
-[Symfony's event-dispatcher library](https://github.com/symfony/event-dispatcher).
-- Zend dispatcher: This dispatcher makes used of
-[Zend Framework's event manager](https://github.com/zendframework/zend-eventmanager).
-
-## Dispatching
-
-### Simple Dispatcher
-
-The, what we call, *Simple Dispatcher* is a dispatcher class that is implemented by
-the PhpAb team itself. It's a very simple implementation to which you add listeners
-and subscribers. When an event is dispatched, the listeners are invoked.
-
-Usage is simple:
-
-```php
-$dispatcher = new \PhpAb\Event\Dispatcher();
-```
-
-To add a listener:
-
-```php
-$dispatcher->addListener('my-event', function() {
- // The callback that is invoked. Parameters depend on the event.
-});
-```
-
-To add a subscriber:
-
-```php
-// The Google data collector implements SubscriberInterface but
-// of course you can create your own as well.
-$subscriber = new \PhpAb\Analytics\DataCollector\Google();
-$dispatcher->addSubscriber($subscriber);
-```
-
-### Symfony bridge
-
-The Symfony bridge can be used to create an event dispatcher from the
-[symfony/event-dispatcher](https://github.com/symfony/event-dispatcher)
-library. It does not have support for
-[SubscriberInterface]()
-at the moment.
-
-### Zend Framework bridge
-
-The Zend Framwork bridge can be used to create an event dispatcher from the
-[zendframework/zend-eventmanager](https://github.com/zendframework/zend-eventmanager)
-library. It does not have support for
-[SubscriberInterface]()
-at the moment.
-
-## Event Types
-
-Note that all events are dispatched from the Engine class
-(https://github.com/phpab/phpab/blob/master/src/Engine/Engine.php).
-The library has the following events:
-
-### phpab.participation.block
-
-The `phpab.participation.block` event is dispatched when a user did not participate
-in the test yet and when the [participation manager](participation.html) decided
-that the user should not participate in the particular test.
-
-### phpab.participation.blocked
-
-The `phpab.participation.blocked` event is dispatched when the a user already was
-excluded for a test by the [participation manager](participation.html) and the
-user visits the page again in a new request.
-
-### phpab.participation.variant_missing
-
-The `phpab.participation.variant_missing` event is dispatched when no variant
-has been chosen by the [variant chooser](variants.html) or when the variant no
-longer exists. This can happen when the user has a cookie set but the code has
-changed for example.
-
-### phpab.participation.variant_run
-
-The `phpab.participation.variant_run` event is dispatched when a variant is
-activated. This will happen for new users as well as for existing users.
diff --git a/source/docs/components/google-analytics-experiments/index.md b/source/docs/components/google-analytics-experiments/index.md
deleted file mode 100644
index 813e22d..0000000
--- a/source/docs/components/google-analytics-experiments/index.md
+++ /dev/null
@@ -1,66 +0,0 @@
----
-layout: documentation
-title: Google Analytics Experiments
----
-
-# Google Analytics Experiments
-
-PhpAb supports both **Classic Google Analytics Experiments** (legacy version) and **Universal Analytics Experiments** (current version).
-Google provides different ways to interact with it. This refers to the **server-side** implementation, which means you will have to create the definition of the tests using Google Analytics and implement it in PHP using PhpAb.
-
-To implement the experiments we assume:
-* you are familiar with Google Analytics;
-* you are familiar with Google Analytics Experiments.
-
-If you aren't, worry not, Google provides extensive documentation about how these topics.
-Read more:
-* [Classic Google Analytics Experiments](https://developers.google.com/analytics/devguides/collection/gajs/experiments)
-* [Universal Google Analytics Experiments](https://developers.google.com/analytics/devguides/collection/analyticsjs/experiments?hl=en)
-
-Now that you are familiar with it, let's summarize the steps required to use PhpAb with Google Analytics (GA):
-* In GA: [Integrate Google Analytics tracking](#integrate-google-analytics-tracking)
-* In GA: [Set the goal](#create-goals) your test will try to improve.
-* In GA: [Set up an experiments](#set-up-an-experiment) against a goal.
-* In PhpAB: Create tests indicating the **Experiment ID** provided by GA for the experiment.
-* Run the PhpAb
-* Use GoogleClassicAnalytics or GoogleUniversalAnalytics to render the JavaScript that will let GA know which variant users are expericing.
-
-After that, you will be able to read the result of your tests in GA.
-Note: keep in mind that GA updates experiments data hours later and not in real time.
-
-## Integrate Google Analytics Tracking
-
-Google Analytics allows you to have insights about your website usage and to perform tests that can alter the behaviour of your website users. All combined in a powerful yet simple interface.
-
-Follow [Google's instructions](https://support.google.com/analytics/answer/1008080?hl=en) to set up an account.
-
-## Create goals
-
-The whole purpose of running tests is to see if a variation performs better than another variation. If it does, adopt it and start again.
-However, "better" might have different meanings. You might want to test the engagement of users, the amount of people that visit a page or, of course, how many buy a product.
-This is why setting your goals is mandatory in Google Analytics.
-Follow up [these instructions](https://support.google.com/analytics/answer/1032415?hl=en) to set them.
-
-## Set up an experiment
-
-We strongly recommend you to read the following page before you go any further: [https://support.google.com/analytics/answer/1745154](https://support.google.com/analytics/answer/1745154).
-It will illustrate what a typical experiment cycle is.
-
-Once you're familiar with it, you can create experiments using the [Content Experiment Interface](https://support.google.com/analytics/answer/1745154).
-
-Pay special attention to the **Experiment ID** shown in the interface since that will have to be the identifier of the test you create.
-
-```php
-// ...
-$test = new Test(
- $test1Name,
- [],
- [Google::EXPERIMENT_ID => '0OOzcd7jRImEIZuAcSgQmA']
-);
-// ..
-```
-
-
-
-Now that you know what GA Experiments are, go to [Getting started](/docs/getting-started.html) for how to add tests or to [Analytics page](analytics.html) for the full Google Analytics implementation.
-
diff --git a/source/docs/components/participation.md b/source/docs/components/participation.md
deleted file mode 100644
index a2d6dc1..0000000
--- a/source/docs/components/participation.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-layout: documentation
-title: Participation
----
-
-# Participation
-
-## Manager
-
-The participation manager uses a storage to determine if a user participates in a
-test. You can use the participation manager to determine which variation is chosen
-for a test and if a user is actually participating in a test.
-
-```php
-interface ManagerInterface
-{
- /**
- * Gets the variant the user is participating in for the given test.
- *
- * @param TestInterface|string $test The identifier of the test to get the variant for.
- * @return string|null Returns the identifier of the variant or null if not participating.
- */
- public function getParticipatingVariant($test);
-
- /**
- * Check if the user participates in a test or a specific variant of the test
- *
- * @param TestInterface|string $test The identifier of the test to check.
- * @param VariantInterface|string|null $variant The identifier of the variant to check
- * @return boolean|string Returns true when the user participates; false otherwise.
- */
- public function participates($test, $variant = null);
-
- /**
- * Sets the participation to a test with the participation at a specific variant.
- *
- * @param TestInterface|string $test The identifier of the test that should be participated.
- * @param VariantInterface|string|null $variant The identifier of the variant that was chosen or
- * null if the user does not participate in the test.
- */
- public function participate($test, $variant);
-}
-```
-
-## Filters
-
-Filters are used to determine participation. You can bind filters to tests and you
-can also set a default filter for all tests in the engine. A filter simply returns
-`true` or `false` which means the participation state.
-
-### Percentage
-
-The percentage filter only allows the configured percentage amount of people to
-participate in the test.
diff --git a/source/docs/components/storage.md b/source/docs/components/storage.md
deleted file mode 100644
index 5607504..0000000
--- a/source/docs/components/storage.md
+++ /dev/null
@@ -1,96 +0,0 @@
----
-layout: documentation
-title: Storage and adapters
----
-
-# Storage and adapters
-
-When a user visits the application, the participation manager decides whether or not
-the user will participate in a test. And if so, in which test the user will
-participate. That choice will be remembered so that the user will have the same
-experience even when the page is reloaded.
-
-In order to remember that choice *PhpAb* make use of storage providers. You can
-configure the library to use a specific storage adapter.
-
-## Cookie
-
-The `Cookie` storage provider saves the tests and variants in which the user
-participates, in a cookie. Only one cookie is used and you can configure the name
-and lifetime of it.
-
-### Usage
-
-```php
-use PhpAb\Storage\Adapter\Cookie;
-use PhpAb\Storage\Storage;
-use PhpAb\Participation\Manager;
-
-// Create a Storage and its Adapter
-$adapter = new Cookie('phpab');
-$storage = new Storage($adapter);
-
-// Create a Participation Manager
-$manager = new Manager($storage);
-
-//...
-```
-
-Decide the name and the ttl of the cookie:
-
-```php
-$nameOfCookie = 'myCookie';
-$ttl = 86400; // in seconds
-$adapter = new Cookie($nameOfCookie, $ttl);
-```
-
-## Session
-
-### Installation
-
-This implements [Aura Sessions library](https://github.com/auraphp/Aura.Session), reason which it must be include as external dependency.
-To add it simply use composer as:
-
-```bash
-composer require phpab/storage-aurasession
-```
-
-### Usage
-```php
-use PhpAb\Storage\Adapter\AuraSession;
-use PhpAb\Storage\Storage;
-use PhpAb\Participation\Manager;
-
-// Create a Storage and its Adapter
-$adapter = new AuraSession();
-$storage = new Storage($adapter);
-
-// Create a Participation Manager
-$manager = new Manager($storage);
-
-//...
-```
-
-The `AuraSession` storage provider remembers the choices just for the current session. When a new session
-is generated, the choices of the tests are cleared and phpab will re-evaluate if the user should participate.
-
-## Runtime
-
-The `Runtime` storage provider remembers the choices only for the current request. It
-could be useful to use this provider for testing or development. In production you
-should avoid this storage provider.
-
-```php
-use PhpAb\Storage\Adapter\Runtime;
-use PhpAb\Storage\Storage;
-use PhpAb\Participation\Manager;
-
-// Create a Storage and its Adapter
-$adapter = new Runtime();
-$storage = new Storage($adapter);
-
-// Create a Participation Manager
-$manager = new Manager($storage);
-
-//...
-```
\ No newline at end of file
diff --git a/source/docs/components/variants.md b/source/docs/components/variants.md
deleted file mode 100644
index c8a9354..0000000
--- a/source/docs/components/variants.md
+++ /dev/null
@@ -1,72 +0,0 @@
----
-layout: documentation
-title: Variants
----
-
-# Variants
-
-## Types
-
-### Simple
-
-The simple variant type has no extra logic. It's simply activated and the name is
-stored in the [storage](storage.html).
-
-```php
-$test = new \PhpAb\Test\Test('foo_test');
-$test->addVariant(new \PhpAb\Variant\SimpleVariant('_control'));
-```
-
-### Callback
-
-When the callback variant is activated, it will trigger a callback function. You can
-execute logic at that moment.
-
-```php
-$test = new \PhpAb\Test\Test('foo_test');
-$test->addVariant(new \PhpAb\Variant\CallbackVariant('_control', function () {
- echo '_control';
-}));
-$test->addVariant(new \PhpAb\Variant\CallbackVariant('v2', function () {
- echo 'v2';
-}));
-```
-
-### Custom Type
-
-A custom variant type can easily be created by implementing `PhpAb\Variant\VariantInterface`
-
-## Choosers
-
-How a variant is chosen depends on the *variant chooser* that has been set for a test.
-We support two variant choosers out of the box.
-
-### Static
-
-A static chooser has a predefined choice set. Simply pass the index of the variant of
-choice to the constructor.
-
-### Random
-
-The random variant chooser picks a random (like the name says) variant from the given
-list of variants.
-
-### Custom
-
-To create your own variant chooser, create a class that implements `PhpAb\Variant\Chooser\ChooserInterface`.
-
-```php
- [
- 'type' => 'callback',
- 'options' => [
- 'callback' => function() {
- },
- ],
-],
-```
-
-### Event Manager
-
-The event manager variant will attach a listener to an event manager when executed.
-Since the phpab engine is started at the startup of the application, you can listen
-to every event.
-
-```php
-'my-variant' => [
- 'type' => 'event_manager',
- 'options' => [
- 'event_manager' => 'my_event_manager',
- 'event' => 'my_event',
- 'priority' => 100,
- 'callback' => function() {
- },
- ],
-],
-```
-
-Only the `event` and the `callback` options are required. When no `event_manager`
-option is provided, the event manager from the application is used. The default value
-for the priority option is `0`.
-
-When the callback is a string and is not a callable function, it will be loaded
-from the service manager. In other words, you can specify a valid service name as
-well.
-
-### Simple
-
-The simple variant will note execute any further logic when activated.
-
-```php
-'my-variant' => [
- 'type' => 'simple',
-],
-```
-
-### Service Manager
-
-The service manager variant is a fallback variant. When the type is not known, it will
-try to load the variant from the service manager with the type as the service name.
-
-```php
-'my-variant' => [
- 'type' => 'my_service_name',
-],
-```
-
-Alternatively you can specify the service name straight away like this:
-
-```php
-'my-variant' => 'my_service_name',
-```
-
-## Configuration Example
-
-```php
- [
- 'storage' => 'cookie',
- 'storage_options' => [
- 'name' => 'phpab',
- 'ttl' => 3600,
- ],
- 'tests' => [
- 'button-test' => [
- 'filter' => 'phpab.default_filter',
- 'variant_chooser' => 'phpab.default_variant_chooser',
- 'variants' => [
- '_control' => [
- 'type' => 'simple',
- ],
- 'alternative' => [
- 'type' => 'simple'
- ],
- ],
- ],
- ],
- ],
-];
-
-```
diff --git a/source/docs/getting-started.md b/source/docs/getting-started.md
deleted file mode 100644
index 1783be1..0000000
--- a/source/docs/getting-started.md
+++ /dev/null
@@ -1,98 +0,0 @@
----
-layout: documentation
-title: Getting started
----
-
-# Getting started with PhpAb
-
-Hello world! This guide will help you get started with using php in your project.
-
-Before you start using phpab/phpab, you need to know what A/B testing is. If you are new to
-A/B testing we recommend you read the documentation index where we explain the basics of A/B testing
-especially for you: [Understanding A/B testing](index.md).
-
-## Installation
-
-The recommended way of installing phpab/phpab is via [Composer](http://getcomposer.org/doc/00-intro.md).
-
-```
-composer require phpab/phpab
-```
-
-## Basic usage
-
-### 1. Participation and Storage
-
-It's common to only run tests for a selected group of people. This can be done using a participation
-manager. When tests are activated, we need to store the choice that has been made for the user. This
-is done using a storage type. In this case we use cookies.
-
-```php
-$storage = new \PhpAb\Storage\Cookie('phpab');
-$participationManager = new \PhpAb\Participation\Manager($storage);
-```
-
-We have implemented several storage types, you can read more about them [here](storage.md).
-
-### 2. Analytics Collecting
-
-It makes no sense to run tests without analyzing the results. A common way is to use Google Analytics to
-meassure what tests are used. Phpab makes used of data collectors to collect the started tests.
-
-```php
-$analyticsData = new \PhpAb\Analytics\Google\DataCollector();
-```
-
-### 3. Events
-
-An event dispatcher must be created which is used later on. This event dispatcher can be used to hook
-into the API and listen to tests. The analytics data collector should be attached to the event dispatcher
-so that it registers statistics about the tests.
-
-```php
-$dispatcher = new \PhpAb\Event\Dispatcher();
-$dispatcher->addSubscriber($analyticsData);
-```
-
-### 4. Engine
-
-The engine is used to run tests. You can pass along a default variant chooser and participation filter
-here as well. More about that later on.
-
-```php
-$filter = new \PhpAb\Participation\PercentageFilter(50);
-$chooser = new \PhpAb\Variant\RandomChooser();
-$engine = new PhpAb\Engine\Engine($participationManager, $dispatcher, $filter, $chooser);
-```
-
-### 5. Adding Tests
-
-Adding a test is simple,
-
-```php
-$test = new \PhpAb\Test\Test('foo_test');
-$test->addVariant(new \PhpAb\Variant\SimpleVariant('_control'));
-$test->addVariant(new \PhpAb\Variant\CallbackVariant('v1', function () {
- echo 'v1';
-}));
-$test->addVariant(new \PhpAb\Variant\CallbackVariant('v2', function () {
- echo 'v2';
-}));
-$test->addVariant(new \PhpAb\Variant\CallbackVariant('v3', function () {
- echo 'v3';
-}));
-
-$engine->addTest($test);
-```
-
-### 6. Start your engines
-
-The last step is to start the engine and render the Google Analytics script.
-
-```php
-$engine->start();
-```
-```php
-$analytics = new \PhpAb\Analytics\Renderer\GoogleUniversalAnalytics($analyticsData->getTestsData());
-echo $analytics->getScript();
-```
diff --git a/source/docs/index.md b/source/docs/index.md
deleted file mode 100644
index 02ce5da..0000000
--- a/source/docs/index.md
+++ /dev/null
@@ -1,47 +0,0 @@
----
-layout: documentation
-title: Documentation index
----
-
-# Documentation
-
-This is the documentation index. In this documentation we will explain the usage
-of PhpAb. We will describe design of the library and all the components it exists
-of.
-
-Before you go into depth it's important to realize what A/B testing is and how it
-works.
-
-## Understanding A/B testing
-
-A/B testing, sometimes also called bucket tests or split-run testing, is a way
-to run an experiment with two variants, A and B. A and B are also called the
-control and the variation.
-
-The goal is to run an experiment and analyze with variation has an outcome that
-meets the requirements most. Requirements can variate a lot and totally depend on
-the business case. One could use A/B testing for user experience for example. But
-one could also apply A/B testing to technical problems to see which version of an
-application performs better for example.
-
-## Multivariate testing
-
-Multivariate testing is very similar to A/B testing with a difference that one
-runs multiple variants in an experiment. This library also supports multivariate
-testing.
-
-## References
-
-For more information on A/B testing, Google is your best friend. We've made a
-selection of some useful websites that you can visit.
-
-* https://en.wikipedia.org/wiki/A/B_testing
-* https://en.wikipedia.org/wiki/Multivariate_statistics
-* https://vwo.com/ab-testing/
-* https://blog.kissmetrics.com/ab-testing-introduction/
-* http://conversionxl.com/how-to-build-a-strong-ab-testing-plan-that-gets-results/
-* http://blog.hubspot.com/blog/tabid/6307/bid/30556/The-Critical-Difference-Between-A-B-and-Multivariate-Tests.aspx
-
-### License
-
-PhpAb is released under the MIT license.
diff --git a/source/docs/library-layout.md b/source/docs/library-layout.md
deleted file mode 100644
index df5fd39..0000000
--- a/source/docs/library-layout.md
+++ /dev/null
@@ -1,57 +0,0 @@
----
-layout: documentation
-title: Library Layout
----
-
-# Library layout
-
-In this document the layout of the library is described. It's good to understand this
-layout if you want to extend the library or introduce new features.
-
-## Engine
-
-The most important component is the Engine. An instance of Engine will control all
-your tests. Generally you would only have one instance of this Engine. The engine
-should be started using the `Engine::start` method. By starting the engine, the
-tests and their variants are activated. Some variants contain a callback method
-which can contain code hook into your application. It's very important to realize
-that starting this engine should happen as early as possible for this reason.
-
-## Analytics
-
-The analytics component collects the data about started tests and variants. This is
-needed in order to handle this later on. Depending on your prefered analytics type,
-the data is handled differently. For example when using Google Analytics, you need
-to embed a JavaScript in your application in order to send the collected data to
-Google. In case of PDO analytics the data needs to be written to a database and there
-is nothing to render.
-
-This library does not provide a way to analyze the collected data. It only registers
-the data. It's up to user-domain to interpret the data and analyze it.
-
-## Events
-
-`PhpAb` provides an event dispatcher which makes it possible to add hooks to the
-system. We provide various immplementations for event managers. There is a simple
-event dispatcher but there is also support to use the Symfony Event dispatcher or
-Zend Framework 2's event manager.
-
-## Participation
-
-In order to decide if users should participate, we have created a participation
-manager. This participation manager makes use of filters in order to decide if a
-user is included in a test.
-
-## Storage
-
-When a test has been activated, the actiavated test should be remembered. You don't
-want to see version A of your application during a first request and a version B
-when you visit a different page. In order to preserve the selected choice, we use a
-storage provider to remember your choice. The most common storage is probably a
-cookie storage but there are alternatives.
-
-## Variants
-
-Variants represent the choice that is made for a test. It's possible to run
-additional code when a variation is activated. This way it becomes possible to change
-certain parts of your application depending on the variant that is chosen.
diff --git a/source/index.md b/source/index.md
deleted file mode 100644
index e4d427d..0000000
--- a/source/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
----
-layout: home
----
diff --git a/template/404.twig b/template/404.twig
deleted file mode 100644
index 66c9f3e..0000000
--- a/template/404.twig
+++ /dev/null
@@ -1,36 +0,0 @@
-{% extends "default.twig" %}
-
-{% block content %}
-
-
-
-{% endblock %}
diff --git a/template/documentation.twig b/template/documentation.twig
deleted file mode 100644
index f243caa..0000000
--- a/template/documentation.twig
+++ /dev/null
@@ -1,38 +0,0 @@
-{% extends "default.twig" %}
-
-{% block content %}
-
-
-
-
-
-
-
-
- {{ content|raw }}
-
-
-
-
-
-{% endblock %}
diff --git a/template/home.twig b/template/home.twig
deleted file mode 100644
index 2f28c83..0000000
--- a/template/home.twig
+++ /dev/null
@@ -1,125 +0,0 @@
-{% extends "default.twig" %}
-
-{% block topbar %}
-{% endblock %}
-
-{% block content %}
-
-
-
-
-
- Integrations
-
-
-
- PhpAb nicely integrates with the following frameworks.
-
-
-
-
-
-
-
-
-
- Analytics
-
-
-
- You choose where to you store analytics of your tests.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-{% endblock %}
diff --git a/vendor/bootstrap/.bower.json b/vendor/bootstrap/.bower.json
new file mode 100644
index 0000000..d4ef6c5
--- /dev/null
+++ b/vendor/bootstrap/.bower.json
@@ -0,0 +1,47 @@
+{
+ "name": "bootstrap",
+ "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
+ "version": "3.2.0",
+ "keywords": [
+ "css",
+ "js",
+ "less",
+ "mobile-first",
+ "responsive",
+ "front-end",
+ "framework",
+ "web"
+ ],
+ "homepage": "http://getbootstrap.com",
+ "main": [
+ "less/bootstrap.less",
+ "dist/css/bootstrap.css",
+ "dist/js/bootstrap.js",
+ "dist/fonts/glyphicons-halflings-regular.eot",
+ "dist/fonts/glyphicons-halflings-regular.svg",
+ "dist/fonts/glyphicons-halflings-regular.ttf",
+ "dist/fonts/glyphicons-halflings-regular.woff"
+ ],
+ "ignore": [
+ ".*",
+ "_config.yml",
+ "CNAME",
+ "composer.json",
+ "CONTRIBUTING.md",
+ "docs",
+ "js/tests",
+ "test-infra"
+ ],
+ "dependencies": {
+ "jquery": ">= 1.9.0"
+ },
+ "_release": "3.2.0",
+ "_resolution": {
+ "type": "version",
+ "tag": "v3.2.0",
+ "commit": "c068162161154a4b85110ea1e7dd3d7897ce2b72"
+ },
+ "_source": "https://github.com/twbs/bootstrap.git",
+ "_target": "~3.2.0",
+ "_originalSource": "bootstrap"
+}
\ No newline at end of file
diff --git a/vendor/fontawesome/.bower.json b/vendor/fontawesome/.bower.json
new file mode 100644
index 0000000..723bdea
--- /dev/null
+++ b/vendor/fontawesome/.bower.json
@@ -0,0 +1,14 @@
+{
+ "name": "fontawesome",
+ "homepage": "https://github.com/FortAwesome/Font-Awesome",
+ "version": "4.0.3",
+ "_release": "4.0.3",
+ "_resolution": {
+ "type": "version",
+ "tag": "v4.0.3",
+ "commit": "dc23a94e16a8daa3cbb3c7fa34d63e2812637b8f"
+ },
+ "_source": "https://github.com/FortAwesome/Font-Awesome.git",
+ "_target": "~4.0",
+ "_originalSource": "fontawesome"
+}
\ No newline at end of file
diff --git a/vendor/fontawesome/.gitignore b/vendor/fontawesome/.gitignore
new file mode 100644
index 0000000..63dd521
--- /dev/null
+++ b/vendor/fontawesome/.gitignore
@@ -0,0 +1,32 @@
+*.pyc
+*.egg-info
+*.db
+*.db.old
+*.swp
+*.db-journal
+
+.coverage
+.DS_Store
+.installed.cfg
+_gh_pages/*
+
+.idea/*
+.svn/*
+src/website/static/*
+src/website/media/*
+
+bin
+cfcache
+develop-eggs
+dist
+downloads
+eggs
+parts
+tmp
+.sass-cache
+node_modules
+
+src/website/settingslocal.py
+stunnel.log
+
+.ruby-version
diff --git a/vendor/jquery/.bower.json b/vendor/jquery/.bower.json
new file mode 100644
index 0000000..0449434
--- /dev/null
+++ b/vendor/jquery/.bower.json
@@ -0,0 +1,25 @@
+{
+ "name": "jquery",
+ "main": "dist/jquery.js",
+ "license": "MIT",
+ "ignore": [
+ "package.json"
+ ],
+ "keywords": [
+ "jquery",
+ "javascript",
+ "browser",
+ "library"
+ ],
+ "homepage": "https://github.com/jquery/jquery-dist",
+ "version": "2.2.3",
+ "_release": "2.2.3",
+ "_resolution": {
+ "type": "version",
+ "tag": "2.2.3",
+ "commit": "af22a351b2ea5801ffb1695abb3bb34d5bed9198"
+ },
+ "_source": "https://github.com/jquery/jquery-dist.git",
+ "_target": ">= 1.9.0",
+ "_originalSource": "jquery"
+}
\ No newline at end of file
diff --git a/vendor/jquery/src/.jshintrc b/vendor/jquery/src/.jshintrc
new file mode 100644
index 0000000..ea3549d
--- /dev/null
+++ b/vendor/jquery/src/.jshintrc
@@ -0,0 +1,29 @@
+{
+ "boss": true,
+ "curly": true,
+ "eqeqeq": true,
+ "eqnull": true,
+ "expr": true,
+ "immed": true,
+ "noarg": true,
+ "quotmark": "double",
+ "undef": true,
+ "unused": true,
+
+ "sub": true,
+
+ // Support: IE < 10, Android < 4.1
+ // The above browsers are failing a lot of tests in the ES5
+ // test suite at http://test262.ecmascript.org.
+ "es3": true,
+
+ "globals": {
+ "window": true,
+ "JSON": false,
+
+ "jQuery": true,
+ "define": true,
+ "module": true,
+ "noGlobal": true
+ }
+}