Objective-PHP

From Electriki
Jump to: navigation, search

This is something i wrote some time in 2k9 just for the hell of it

<?php

/**
 * @package OPHPLolwut
 */

Abstract class superObject {
	private $binded=	array();

	function __call($name,$args) {
		if(!isset($this->$name)) {
			if(!isset($this->binded[$name]) || $this->binded[$name] !== true) throw new noMethodError();
			$this->$name= new $name();
		}
		return $this->$name->doIt($this,$args);
	}

/**
 * @param mixed $i input
 * @param array $args arguments
 */
	abstract function doIt($i,$args);

/**
 * @var string $name
 */
	function bind($name) {
		$this->binded[$name]=	true;
	}

	function unbind($name=null) {
		if(isset($this->binded[$name])) {
			$this->binded["name"]=	false;
			unset($this->$name);
		}
	}

	function __construct() {
		$this->bind('hasMethod');
	}
}

class object extends superObject {
	function __construct() {
		parent::__construct();
	}
	function doIt($i,$args) {
		return $this;
	}
}

class superException extends Exception {
	function __construct($message="",$data=null,$code=0) {
		parent::__construct($message,$code);
		$this->data=	$data;
	}
}

class error extends superException {}
class noMethodError extends error {}

class hasMethod extends object {
	function doIt($i,$args) {
		$method=	array_pop($args);
		return method_exists($i,$method);
	}
}


class value extends object {
	function __construct() {
		$this->bind('set');
		$this->bind('get');
		$this->bind('isset_');
	}
}

class set extends object {
	function doIt($i,$args) {
		if(count($args) != 1) throw new superException("",$args);

		if($i instanceOf value) { $i->value=	array_pop($args); return $i; }
		#if($i instanceOf accessor) { $i->value()->set(array_pop($args)); return $i; }
		return new nil();
	}
}

class get extends object {
	function doIt($i,$args) {
		if($i instanceOf value) { if($i->isset_()) return $i->value; }
		if($i instanceOf accessor) { return $i->value()->get(); }
		return new nil();
	}
}

class isset_ {
	function doIt($i,$args) {
		if($i instanceof value) { if(isset($i->value)) return $i->value; }
		return new nil();
	}
}





class accessor extends object {
	function __construct() {
		$this->bind('value');
	}
	function doIt($i,$args) {
		if(isset($args[0])) {
			return $this->value()->set($args[0]);
		}
		return $this->value()->get();
	}
}

#############################################################################


try {

	$a=	new accessor();
	$a->value()->set("abc123");
	echo $a->value()->get();

}catch(SuperException $e) {
	printf($e->getTraceAsString()." ".$e->getFile()."(".$e->getLine().")\nMessage:".$e->getMessage()."\nData:\n".var_export($e->data,1));
}