Skip to content
Permalink
Browse files

added LegacyObject

  • Loading branch information...
dg committed Aug 5, 2019
1 parent 86fa4d8 commit 5fe4cacd5b93a9202cbe77fa3b8b0b8491219a92
@@ -19,9 +19,13 @@
"php": ">=7.1"
},
"require-dev": {
"nette/utils": "^3.0",
"tracy/tracy": "^2.6",
"nette/tester": "^2.0"
},
"conflict": {
"nette/utils": "<3.0"
},
"autoload": {
"classmap": ["src/"]
},
@@ -0,0 +1,161 @@
<?php
/**
* This file is part of the Nette Framework (https://nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare(strict_types=1);
namespace Nette;
use Nette;
/**
* Nette\LegacyObject is the ultimate ancestor of all instantiable classes.
*
* It defines some handful methods and enhances object core of PHP:
* - access to undeclared members throws exceptions
* - support for conventional properties with getters and setters
* - support for event raising functionality
* - ability to add new methods to class (extension methods)
*
* Properties is a syntactic sugar which allows access public getter and setter
* methods as normal object variables. A property is defined by a getter method
* or setter method (no setter method means read-only property).
* <code>
* $val = $obj->label; // equivalent to $val = $obj->getLabel();
* $obj->label = 'Nette'; // equivalent to $obj->setLabel('Nette');
* </code>
* Property names are case-sensitive, and they are written in the camelCaps
* or PascalCaps.
*
* Event functionality is provided by declaration of property named 'on{Something}'
* Multiple handlers are allowed.
* <code>
* public $onClick; // declaration in class
* $this->onClick[] = 'callback'; // attaching event handler
* if (!empty($this->onClick)) ... // are there any handlers?
* $this->onClick($sender, $arg); // raises the event with arguments
* </code>
*
* Adding method to class (i.e. to all instances) works similar to JavaScript
* prototype property. The syntax for adding a new method is:
* <code>
* MyClass::extensionMethod('newMethod', function (MyClass $obj, $arg, ...) { ... });
* $obj = new MyClass;
* $obj->newMethod($x);
* </code>
*
* @property-read Nette\Reflection\ClassType|\ReflectionClass $reflection
* @deprecated use trait Nette\SmartObject
*/
abstract class LegacyObject
{
/**
* Access to reflection.
* @return Nette\Reflection\ClassType|\ReflectionClass
*/
public static function getReflection()
{
$class = class_exists(Nette\Reflection\ClassType::class) ? Nette\Reflection\ClassType::class : 'ReflectionClass';
return new $class(get_called_class());
}
/**
* Call to undefined method.
* @param string method name
* @param array arguments
* @return mixed
* @throws MemberAccessException
*/
public function __call($name, $args)
{
return Nette\Utils\LegacyObjectMixin::call($this, $name, $args);
}
/**
* Call to undefined static method.
* @param string method name (in lower case!)
* @param array arguments
* @return mixed
* @throws MemberAccessException
*/
public static function __callStatic($name, $args)
{
return Nette\Utils\LegacyObjectMixin::callStatic(get_called_class(), $name, $args);
}
/**
* Adding method to class.
* @param string method name
* @param callable
* @return mixed
*/
public static function extensionMethod($name, $callback = null)
{
if (strpos($name, '::') === false) {
$class = get_called_class();
} else {
[$class, $name] = explode('::', $name);
$class = (new \ReflectionClass($class))->getName();
}
if ($callback === null) {
return Nette\Utils\LegacyObjectMixin::getExtensionMethod($class, $name);
} else {
Nette\Utils\LegacyObjectMixin::setExtensionMethod($class, $name, $callback);
}
}
/**
* Returns property value. Do not call directly.
* @param string property name
* @return mixed property value
* @throws MemberAccessException if the property is not defined.
*/
public function &__get($name)
{
return Nette\Utils\LegacyObjectMixin::get($this, $name);
}
/**
* Sets value of a property. Do not call directly.
* @param string property name
* @param mixed property value
* @return void
* @throws MemberAccessException if the property is not defined or is read-only
*/
public function __set($name, $value)
{
Nette\Utils\LegacyObjectMixin::set($this, $name, $value);
}
/**
* Is property defined?
* @param string property name
* @return bool
*/
public function __isset($name)
{
return Nette\Utils\LegacyObjectMixin::has($this, $name);
}
/**
* Access to undeclared property.
* @param string property name
* @return void
* @throws MemberAccessException
*/
public function __unset($name)
{
Nette\Utils\LegacyObjectMixin::remove($this, $name);
}
}

0 comments on commit 5fe4cac

Please sign in to comment.
You can’t perform that action at this time.