public function serialize()
{
if ($this->scope === null) {
$this->scope = new ClosureScope();
$this->scope->toserialize++;
}
if (!$this->scope->serializations++) {
$this->scope->storage = new SplObjectStorage();
}
$scope = $object = null;
$reflector = $this->getReflector();
if (!static::supportBinding()) {
$this->reference = new SelfReference($this->closure);
} else {
if ($reflector->isBindingRequired()) {
$object = $reflector->getClosureThis();
if ($scope = $reflector->getClosureScopeClass()) {
$scope = $scope->name;
}
} elseif ($reflector->isScopeRequired()) {
if ($scope = $reflector->getClosureScopeClass()) {
$scope = $scope->name;
}
if ($this->serializeThis) {
$object = $reflector->getClosureThis();
}
}
}
$this->scope->storage[$this->closure] = $this;
$use = null;
$code = $reflector->getCode();
if ($variables = $reflector->getUseVariables()) {
$use =& $this->mapByReference($variables);
}
$ret = serialize(array('use' => $use, 'function' => $code, 'scope' => $scope, 'this' => $object, 'self' => $this->reference));
if (!--$this->scope->serializations && !--$this->scope->toserialize) {
$this->scope->storage = null;
}
return $ret;
}