Decorate
========
A PHP class usefull to decorate functions
## Introduction
This class represent the beginning of functional programming in PHP.
The decorator patter can easly make your application modular while functions transform it in to an event-driven application.
The goal of this class is to decorate functions, taking advantage of objects to make a queue-like structure and store in it partial results and functions.
Note that with the other my class https://github.com/jstar88/Editable it can show you a full dynamic decorated system usefull, for example, for a plugin system or to build a modular application.
## Usage
Usage it's pretty easy: require the main class
```php
require "Decorate.php";
```
and then you can use its 2 methods:
### onBefore
```php
$function = Decorate::onBefore($function, $newFunction);
```
Where
* ```$function``` is the callable function to intercept
* ```$newFunction``` is the callable function that will be called before the other one.Note that the arguments of this function are the same of ```$function```, in this way you have all the things usefull to build your interceptor-logic
* the method return a ```FunctionEmulator``` class
### onAfter
```php
$function = Decorate::onAfter($function, $newFunction);
```
Where
* ```$function``` is the callable function
* ```$newFunction``` is the callable function that will be called after the other one.Note that the argument of this function is just the return of the other function
* the method return a ```FunctionEmulator``` class
### the return: FunctionEmulator
This object is really a function emulator and you can use it as a standard function, but you also call its method!
Expecially you can use this object to decorate him again like a callable function.
Not only,it's a object where inside are stored the original function and the new one. You can use these methods:
* ```getPreReturn()```: this function can be called with how many arguments you want and they are the same arguments of your main function to call.
It will return the original function return.
* ```getParent()```: this function will return the original function or older FunctionEmulator. In this way you can iterate on the history and find all the result of aggregated functions.
## Advanced usage
If have you noticed that functions aggregations can be represented and easily manipulated by a LinkedList, then you got it!
I provide two implementations of LikedList:
* ```OnAfterDecorativeLinkedList```
* ```OnBeforeDecorativeLinkedList```
These classes extends the standard PHP ```SplDoublyLinkedList``` so you can add,replace,move etc functions as API say.
Also ,implementing the ```FunctionEmulable``` interface they can be called as functions.
An example:
```php
require '../../Decorate.php';
$a = new OnAfterDecorativeLinkedList();
$a->push(function(){ echo 1;});
$a->push(function(){ echo 2;});
$a->push(function(){ echo 3;});
$a(); // print 123
echo '<br>';
$a = new OnBeforeDecorativeLinkedList();
$a->push(function(){ echo 1;});
$a->push(function(){ echo 2;});
$a->push(function(){ echo 3;});
$a(); // print 321
```
|