phpspec2.2の新機能 - コラボレータの自動生成

phpspec2.2では、コラボレータの自動生成機能が追加されました。[公式サイトのコード](http://www.phpspec.net/en/latest/manual/let-and-letgo.html)を例として使うと：

```php:spec/MarkdownSpec.php
<?php

namespace spec;

use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use Markdown\Writer;

class MarkdownSpec extends ObjectBehavior
{
    function let(Writer $writer)
    {
        $this->beConstructedWith($writer);
    }

    function it_outputs_converted_text(Writer $writer)
    {
        $this->beConstructedWith($writer);
        $writer->writeText("<p>Hi, there</p>")->shouldBeCalled();

        $this->outputHtml("Hi, there");
    }
}
```

これは`Markdown`クラスのスペックです。`Markdown`クラスはコンストラクタの引数として`Markdown\Writer`のインスタンスを受け取り、`outputHtml()`メソッドを呼び出すと、MarkdownをHTMLに変換した結果をそのライターに出力します。

さて、2.1までは実装が全くない状態でこのスペックを実行すると、`Markdown\Writer`クラスが無いというエラーになっていました。(`Markdown\Writer`を自分で作れば、`Markdown`クラスの自動生成は2.0からできていました)

```
$ vendor/bin/phpspec run
Markdown
  16  - it outputs converted text
      exception [exc:ReflectionException("Class Markdown\Writer does not exist")
] has been thrown.

/  skipped: 0%  /  pending: 0%  /  passed: 0%   /  failed: 0%   / broken: 100%
/  1 examples
2 specs
1 example (1 broken)
37ms
```

2.2からはコラボレータも自動生成してくれます。

```
$ vendor/bin/phpspec run
Markdown
  16  - it outputs converted text
      collaborator does not exist : Markdown\Writer

/  skipped: 0%  /  pending: 0%  /  passed: 0%   /  failed: 0%   / broken: 100%
/  1 examples
2 specs
1 example (1 broken)
35ms


  Would you like me to generate an interface `Markdown\Writer` for
  you?
                                                               [Y/n]

Interface Markdown\Writer created in C:\path\to\src\Markdown\Writer.php.

Markdown
  16  - it outputs converted text
      method `Double\Writer\Writer\P1::writeText()` is not defined.

/  skipped: 0%  /  pending: 0%  /  passed: 0%   /  failed: 0%   / broken: 100%
/  1 examples
2 specs
1 example (1 broken)
44ms


  Would you like me to generate a method signature
  `Markdown\Writer::writeText()` for you?
                                                               [Y/n]

  Method signature Markdown\Writer::writeText() has been created.

Markdown
  16  - it outputs converted text
      class Markdown does not exist.

/  skipped: 0%  /  pending: 0%  /  passed: 0%   /  failed: 0%   / broken: 100%
/  1 examples
2 specs
1 example (1 broken)
39ms


  Do you want me to create `Markdown` for you?
                                                               [Y/n]

Class Markdown created in C:\path\to\src\Markdown.php.

Markdown
  16  - it outputs converted text
      method Markdown::__construct not found.

/  skipped: 0%  /  pending: 0%  /  passed: 0%   /  failed: 0%   / broken: 100%
/  1 examples
2 specs
1 example (1 broken)
40ms


  Do you want me to create `Markdown::__construct()` for you?
                                                               [Y/n]

  Method Markdown::__construct() has been created.

Markdown
  16  - it outputs converted text
      method Markdown::outputHtml not found.

/  skipped: 0%  /  pending: 0%  /  passed: 0%   /  failed: 0%   / broken: 100%
/  1 examples
2 specs
1 example (1 broken)
36ms


  Do you want me to create `Markdown::outputHtml()` for you?
                                                               [Y/n]

  Method Markdown::outputHtml() has been created.

Markdown
  16  - it outputs converted text
      some predictions failed:
        Double\Writer\Writer\P1:
          No calls been made that match:
            Double\Writer\Writer\P1->writeText(exact("<p>Hi, there</p>"))
          but expected at least one.

/  skipped: 0%  /  pending: 0%  /  passed: 0%   / failed: 100%  /  broken: 0%
/  1 examples
2 specs
1 example (1 failed)
50ms

```

結果、以下の2つのファイルができました。

```php:src/Markdown.php
<?php

class Markdown
{

    public function __construct($argument1)
    {
        // TODO: write logic here
    }

    public function outputHtml($argument1)
    {
        // TODO: write logic here
    }
}
```

```php:src/Markdown/Writer.php
<?php

namespace Markdown;

interface Writer
{

    public function writeText($argument1);
}
```