public function generateProxyCode(\ReflectionClass $ref)
	{
		$methods = $this->collectProxyMethods($ref);
		$implements = ['\KoolKode\Context\Scope\ScopedProxyInterface'];
				
		$code = 'namespace ' . $ref->getNamespaceName() . ' { ';
		$code .= 'if(!class_exists(' . var_export($ref->name . '__scoped', true) . ', false)) { ';
		$code .= 'final class ' . $ref->getShortName() . '__scoped';
		
		if($ref->isInterface())
		{
			$implements[] = '\\' . $ref->name;
		}
		else
		{
			$code .= ' extends \\' . $ref->name;
		}
		
		$code .= ' implements ' . implode(', ', $implements) . ' { ';
		$code .= 'use \KoolKode\Context\Scope\ScopedProxyTrait; ';
		
		$code .= 'private $__K2Binding, $__K2Scope, $__K2Target; ';
		
		$code .= 'public final function __construct(\KoolKode\Context\Bind\BindingInterface $binding, \KoolKode\Context\Scope\ScopeManagerInterface $scope, \SplObjectStorage & $target) { ';
		$code .= '$this->__K2Binding = $binding; $this->__K2Scope = $scope; $this->__K2Target = & $target; ';
		
		$fieldNames = array_unique($this->collectRemovedFieldNames($ref));
		
		if(!empty($fieldNames))
		{
			$code .= ' unset(';
			
			foreach($fieldNames as $i => $name)
			{
				if($i != 0)
				{
					$code .= ', ';
				}
				
				$code .= '$this->' . $name;
			}
			
			$code .= ');';
		}
		
		$code.= ' } ';
		
		foreach($methods as $method)
		{
			$code .= $this->buildMethodSignature($method, true);
			
			$code .= ' { ';
			$code .= 'if(!$this->__K2Target->offsetExists($this)) { $this->__K2Scope->activateInstance($this); } ';
			$code .= 'return call_user_func_array([$this->__K2Target[$this], __FUNCTION__], func_get_args()); ';
			$code .= '} ';
		}
		
		return $code . ' } } } ';
	}