Extension API

Following https://github.com/atoum/atoum/pull/327 : relocated the source branch.

## atoum extensions

This branch provides an interface to allow users/contributors to write their own extensions, and add some awesome features to atoum dynamically. Here is the roadmap I propose to get this branch merged:

* [x] make it mergeable
* [ ] review code and clean it
* [ ] merge
* [ ] tag atoum to lock the first version of the extension API
* [ ] review extensions
* [ ] move some of them to the org
* [ ] write a blog post somewhere
* [ ] write more awesome extensions (instrumentation, phpunit, ...)

## What we get now?

There already are some extensions ready:

### [atoum-visibility-extension](https://github.com/jubianchi/atoum-visibility-extension)

Allows user to test hidden (protected/private) methods.

```php
<?php

namespace tests\units
{
	use mageekguy\atoum;
	class foo extends atoum\test
	{
		public function testBar()
		{
			$this
				->if($sut = new \foo())
				->then
					->object($this->invoke($sut)->bar())->isIdenticalTo($sut)
					->array($this->invoke($sut)->bar($a = uniqid(), $b = uniqid()))->isIdenticalTo(array($a, $b))
                                        //->string($this->invoke('bar')->foo())->isEqualTo('bar::foo')
				->given(
					$this->mockGenerator
						->makeVisible('bar')
						->generate('foo')
				)
				->if($mockedSut = new \mock\foo)
				->and($this->calling($mockedSut)->bar = 'foo')
				->then
					->string($mockedSut->baz())->isEqualTo('foo')
                    ->mock($mockedSut)
                        ->call('bar')->once()
			;
		}
	}
}
```

### [jubianchi/atoum-bdd-extension](https://github.com/jubianchi/atoum-bdd-extension)

Allows users to write their tests in a Spec/BDD style and produce formatted reports:

```php
<?php
namespace jubianchi\example\specs;

use atoum;
use jubianchi\example\formatter as testedClass;

class formatter extends atoum\spec
{
    public function should_format_underscore_separated_method_name()
    {
        $this
            ->given($formatter = new testedClass())
            ->then
                ->invoking->format(__FUNCTION__)->on($formatter)
                    ->shouldReturn('should format underscore separated method name')
        ;
    }
}
```

![atoum_bdd](https://cloud.githubusercontent.com/assets/327237/4967400/28cfc6fc-680f-11e4-9446-ee67eda69622.png)

### [jubianchi/atoum-json-schema-extension](https://github.com/jubianchi/atoum-json-schema-extension)

Allows user to validate JSON against a schema

### [hoaproject/Contributions-Atoum-PraspelExtension](https://github.com/hoaproject/Contributions-Atoum-PraspelExtension)

Integrates Praspel in atoum
Thank you