Welcome

This demo shows your an examples of AOP usage.

Please, choose one of available examples from navigation menu.
You can also try to run this code with XDebug.

Set user name to John
Set user surname to Doe
Set user password to root
  
<?php
/*
 * Go! AOP framework
 *
 * @copyright Copyright 2014, Lisachenko Alexander <lisachenko.it@gmail.com>
 *
 * This source file is subject to the license that is bundled
 * with this source code in the file LICENSE.
 */

namespace Demo\Aspect;

use 
Go\Aop\Aspect;
use 
Go\Aop\Intercept\MethodInvocation;
use 
Go\Lang\Annotation\Around;

/**
 * Fluent interface aspect provides an easy way to reuse "chain" interface for classes
 *
 * Basically, it uses around method to intercept all public setters in the class that implements
 * special marker interface FluentInterface. Then it checks the return value for setter, if it's null,
 * then advice replaces it with reference to the object "$this".
 *
 * @see http://go.aopphp.com/blog/2013/03/19/implementing-fluent-interface-pattern-in-php/
 */
class FluentInterfaceAspect implements Aspect
{
    
/**
     * Fluent interface advice
     *
     * @Around("within(Demo\Aspect\FluentInterface+) && execution(public **->set*(*))")
     *
     * @param MethodInvocation $invocation
     * @return mixed|null|object
     */
    
protected function aroundMethodExecution(MethodInvocation $invocation)
    {
        
$result $invocation->proceed();

        return 
$result !== null $result $invocation->getThis();
    }
}
<?php
/*
 * Go! AOP framework
 *
 * @copyright Copyright 2013, Lisachenko Alexander <lisachenko.it@gmail.com>
 *
 * This source file is subject to the license that is bundled
 * with this source code in the file LICENSE.
 */

namespace Demo\Example;

use 
Demo\Aspect\FluentInterface;

/**
 * Example class to show fluent interface in action
 */
class UserFluentDemo implements FluentInterface
{
    protected 
$name;
    protected 
$surname;
    protected 
$password;

    public function 
setName($name)
    {
        echo 
"Set user name to "$namePHP_EOL;
        
$this->name $name;
    }

    public function 
setSurname($surname)
    {
        echo 
"Set user surname to "$surnamePHP_EOL;
        
$this->surname $surname;
    }

    public function 
setPassword($password)
    {
        if (!
$password) {
            throw new \
InvalidArgumentException("Password shouldn't be empty");
        }
        echo 
"Set user password to "$passwordPHP_EOL;
        
$this->password $password;
    }
}