/**
  * @dataProvider getTestData
  */
 public function testGenerate($class, $method, array $arguments)
 {
     $generator = new ProxyClassGenerator();
     $metadata = new ServiceMetadata();
     $reflection = new \ReflectionClass($class);
     $methodMetadata = new MethodMetadata($reflection->getMethod($method));
     $methodMetadata->setRoles(array('ROLE_FOO'));
     $methodMetadata->setReturnPermissions(array('PERMISSION_RETURN'));
     $metadata->addMethod($method, $methodMetadata);
     $definition = new Definition();
     $definition->setClass($reflection->getName());
     list($className, $proxy) = $generator->generate($definition, $metadata);
     $tmpFile = tempnam(sys_get_temp_dir(), 'proxy');
     file_put_contents($tmpFile, $proxy);
     require_once $tmpFile;
     unlink($tmpFile);
     $className = 'SecurityProxies\\' . $className;
     $proxyClass = new $className();
     $mock = $this->getMockBuilder('JMS\\SecurityExtraBundle\\Security\\Authorization\\Interception\\MethodSecurityInterceptor')->disableOriginalConstructor()->getMock();
     $mock->expects($this->once())->method('invoke')->will($this->returnValue($return = new \stdClass()));
     $proxyClass->jmsSecurityExtraBundle__setMethodSecurityInterceptor($mock);
     $this->assertSame($return, call_user_func_array(array($proxyClass, $method), $arguments));
 }
    /**
     * Generates the proxy class
     *
     * @param Definition $definition
     * @param ServiceMetadata $metadata
     * @return array<string, string>
     */
    public function generate(Definition $definition, ServiceMetadata $metadata)
    {
        list($className, $proxy) = $this->getClassDefinition($definition);
        foreach ($metadata->getMethods() as $name => $method) {
            $reflection = $method->getReflection();
            $proxy .= $this->getMethodDefinition($reflection);
            $proxy .= '    static $jmsSecurityExtra__metadata = ' . $this->getMethodSecurityMetadata($method) . ';

    ';
            $proxy .= '    return ';
            $proxy .= '$this->jmsSecurityExtraBundle__methodSecurityInterceptor->invoke(
    ';
            $proxy .= '        ' . $this->getSecureMethodInvocation($method) . ',
    ';
            $proxy .= '        $jmsSecurityExtra__metadata
    ';
            $proxy .= '    );';
            $proxy .= '
    }

    ';
        }
        return array($className, substr($proxy, 0, -6) . '}');
    }