private function methodProxy($method, $meta)
    {
        //Find out if the method is a property getter or setter
        $property = $meta->findProperty($method->getName());

        //If it is not, don't need the proxy
        if(!$property)
        {
            return;
        }

        //If the method is a straight up property setter/getter and not for a start/end node, you don't need a method proxy either.
        if($property->isProperty() && !$property->isStart() && !$property->isEnd())
        {
            return;
        }

        $parts = array();
        $arguments = array();

        //Loop through the methods parameters
        foreach ($method->getParameters() as $parameter)
        {
            //Convert to a variable name, and add it to parts array
            $variable = '$' . $parameter->getName();
            $parts[] = $variable;

            $arg = $variable;

            //If the parameter is optional, set it to its default value in the arguments list.
            if($parameter->isOptional())
            {
                $arg .= ' = ' . var_export($parameter->getDefaultValue(), true);
            }

            //If the variable is passed by reference, put in an ampersand
            if($parameter->isPassedByReference())
            {
                $arg = "& $arg";
            }

            //If the variable is a set class, add the class name as the type
            elseif($c = $parameter->getClass())
            {
                $arg = $c->getName() . ' ' . $arg;
            }

            //If the argument is a array, add array identifier
            if($parameter->isArray())
            {
                $arg = "array $arg";
            }

            //Add the argument to argument array
            $arguments[] = $arg;
        }

        //Join the argument variable names together with commas
        $parts = implode(', ', $parts);

        //Join the arguments with commas
        $arguments = implode(', ', $arguments);

        //Get the method name as a string
        $name = var_export($method->getName(), true);

        //Get the property name as a string
        $propertyName = var_export($property->getName(), true);

        return <<<FUNC

    function {$method->getName()}($arguments)
    {
        self::__load($name, $propertyName);
        return parent::{$method->getName()}($parts);
    }

FUNC;
    }
private function methodProxy($method, $meta)
    {
        //Find out if the method is a property getter or setter
        $property = $meta->findProperty($method->getName());

        //If it is not, don't need the proxy
        if(!$property)
        {
            return;
        }

        //If the method is a straight up property setter/getter and not for a start/end node, you don't need a method proxy either.
        if($property->isProperty() && !$property->isStart() && !$property->isEnd())
        {
            return;
        }

        $parts = array();
        $arguments = array();

        //Loop through the methods parameters
        foreach ($method->getParameters() as $parameter)
        {
            //Convert to a variable name, and add it to parts array
            $variable = '$' . $parameter->getName();
            $parts[] = $variable;

            $arg = $variable;

            //If the parameter is optional, set it to its default value in the arguments list.
            if($parameter->isOptional())
            {
                $arg .= ' = ' . var_export($parameter->getDefaultValue(), true);
            }

            //If the variable is passed by reference, put in an ampersand
            if($parameter->isPassedByReference())
            {
                $arg = "& $arg";
            }

            //If the variable is a set class, add the class name as the type
            elseif($c = $parameter->getClass())
            {
                $arg = $c->getName() . ' ' . $arg;
            }

            //If the argument is a array, add array identifier
            if($parameter->isArray())
            {
                $arg = "array $arg";
            }

            //Add the argument to argument array
            $arguments[] = $arg;
        }

        //Join the argument variable names together with commas
        $parts = implode(', ', $parts);

        //Join the arguments with commas
        $arguments = implode(', ', $arguments);

        //Get the method name as a string
        $name = var_export($method->getName(), true);

        //Get the property name as a string
        $propertyName = var_export($property->getName(), true);

        return <<<FUNC

    function {$method->getName()}($arguments)
    {
        self::__load($name, $propertyName);
        return parent::{$method->getName()}($parts);
    }

FUNC;
    }
private function methodProxy ( $ method , $ meta ) { //Find out if the method is a property getter or setter $ property = $ meta -> findProperty ( $ method -> getName ( ) ) ; //If it is not, don't need the proxy if ( ! $ property ) { return ; } //If the method is a straight up property setter/getter and not for a start/end node, you don't need a method proxy either. if ( $ property -> isProperty ( ) && ! $ property -> isStart ( ) && ! $ property -> isEnd ( ) ) { return ; } $ parts = array ( ) ; $ arguments = array ( ) ; //Loop through the methods parameters foreach ( $ method -> getParameters ( ) as $ parameter ) { //Convert to a variable name, and add it to parts array $ variable = '$' . $ parameter -> getName ( ) ; $ parts [ ] = $ variable ; $ arg = $ variable ; //If the parameter is optional, set it to its default value in the arguments list. if ( $ parameter -> isOptional ( ) ) { $ arg .= ' = ' . var_export ( $ parameter -> getDefaultValue ( ) , true ) ; } //If the variable is passed by reference, put in an ampersand if ( $ parameter -> isPassedByReference ( ) ) { $ arg = "& $arg" ; } //If the variable is a set class, add the class name as the type elseif ( $ c = $ parameter -> getClass ( ) ) { $ arg = $ c -> getName ( ) . ' ' . $ arg ; } //If the argument is a array, add array identifier if ( $ parameter -> isArray ( ) ) { $ arg = "array $arg" ; } //Add the argument to argument array $ arguments [ ] = $ arg ; } //Join the argument variable names together with commas $ parts = implode ( ', ' , $ parts ) ; //Join the arguments with commas $ arguments = implode ( ', ' , $ arguments ) ; //Get the method name as a string $ name = var_export ( $ method -> getName ( ) , true ) ; //Get the property name as a string $ propertyName = var_export ( $ property -> getName ( ) , true ) ; return  <<<FUNC

    function {$method->getName()}($arguments)
    {
        self::__load($name, $propertyName);
        return parent::{$method->getName()}($parts);
    }

FUNC ; }
Creates proxy methods from the reflection method handle and meta information.

@param $method
@param $meta
@return string The method code.
Creates proxy methods from the reflection method handle and meta information .