インスタンス生成を流れるようなインターフェイスで

題名まま。
参考記事:Martin Fowler's Bliki in Japanese - 流れるようなインタフェース

サンプル

var s:Sprite = Sprite(
    new ObjectBinder( new Sprite)
    .property( 'x', 10)
    .property( 'y', 40)
    .property( 'visible', [false])
    .targetInstance
);

使える、のか?

ソース

package
{
    public class ObjectBinder
    {
        public var targetInstance:*;
        public function ObjectBinder( targetInstance:*)
        {
            this.targetInstance = targetInstance;
        }
        public function property( key:String, value:*):ObjectBinder
        {
            targetInstance[ key] = value;
            return this;
        }
        public function method( methodName:String, args:Array = null):ObjectBinder
        {
            targetInstance[ methodName].apply( args, targetInstance);
            return this;
        }
    }
}

PHP

<?php

$japan =& ObjectBinder::create( new Aisatsu())
    ->property( 'mornig', 'おはよう')
    ->property( 'afternoon', 'こんにちは')
    ->property( 'evening', 'こんばんは')
    ->method( 'setDecoration', array( '!'))
    ->target;

class Aisatsu
{
    public $mornig;
    public $afternoon;
    public $evening;
    private $decoration;
    public function setDecoration( $str)
    {
        $this->decoration = $str;
    }
}

class ObjectBinder
{
    public $target;
    private function __construct()
    {}
    public static function &create( &$target)
    {
        $o = new ObjectBinder();
        $o->target =& $target;
        
        return $o;
    }
    public function &property( $key, $value)
    {
        if( !property_exists( $this->target, $key)) throw new Exception( "オブジェクトにプロパティ{$key}はありません。");
        
        $this->target->$key =& $value;
        
        return $this;
    }
    public function &method( $name , &$args = null)
    {
        if( !method_exists( $this->target, $name)) throw new Exception( "オブジェクトにメソッド{$name}はありません。");
        
        if( $args == null) call_user_func( array( $this->target, $name));
        else call_user_func_array( array( $this->target, $name), $args);
        
        return $this;
    }
}