Skip to content

Instantly share code, notes, and snippets.

@marcioAlmada
Last active August 29, 2015 14:27
Show Gist options
  • Save marcioAlmada/05cc7d56cda46c697604 to your computer and use it in GitHub Desktop.
Save marcioAlmada/05cc7d56cda46c697604 to your computer and use it in GitHub Desktop.
<?php
/**
* Macro to backport enum from the future
*/
macro {
enum T_STRING·name {
·ls
(
·rtoken('/^\w+$/')·field
,
','
)
·fields
}
} >> {
final class T_STRING·name {
private static $store;
private function __construct(){}
function __(string $field) : self {
if(! self::$store) {
self::$store = new \stdclass;
·fields ··· {
self::$store->·field = new class extends T_STRING·name {};
}
}
if (! $field = self::$store->$field ?? false)
throw new \Exception(
"Undefined enum field " . __CLASS__ . "->{$field}.");
}
}
}
macro { \T_STRING·enum->T_STRING·field } >> { \T_STRING·enum::__(@T_STRING·field) }
// src
enum Fruits {
Apple,
Orange
}
var_dump(\Fruits->Orange <=> \Fruits->Apple);
<?php
final class Fruits {
private static $store;
private function __construct(){}
function __(string $field) : self {
if(! self::$store) {
self::$store = new \stdclass;
self::$store->Apple = new class extends Fruits {};
self::$store->Orange = new class extends Fruits {};
}
if (! $field = self::$store->$field ?? false)
throw new \Exception(
"Undefined enum field " . __CLASS__ . "->{$field}.");
}
}
var_dump(\Fruits::__(@Orange) <=> \Fruits::__(@Apple));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment