Skip to content

Instantly share code, notes, and snippets.

@siratama
Last active October 14, 2015 12:04
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save siratama/ceb9a372fe971f7789f3 to your computer and use it in GitHub Desktop.
Save siratama/ceb9a372fe971f7789f3 to your computer and use it in GitHub Desktop.
package com.dango_itimi.utils;
import haxe.rtti.Meta;
using com.dango_itimi.utils.MetaUtil;
class MetaField
{
public var name(default, null):String;
public var value(default, null):Array<Dynamic>;
public function new(name:String, value:Array<Dynamic>)
{
this.name = name;
this.value = value;
}
}
class MetaUtil
{
public static function getMetaFieldsWithInstance<T>(instance:T, metaLabel:String):Array<MetaField>
{
return Type.getClass(instance).getMetaFields(metaLabel);
}
public static function getMetaFields(cls:Class<Dynamic>, metaLabel:String):Array<MetaField>
{
var metaFieldSet:Array<MetaField> = [];
var metaFields = Meta.getFields(cls);
var fieldStrings = Reflect.fields(metaFields);
for(fieldString in fieldStrings)
{
switch(metaFields.hasMetaData(fieldString, metaLabel))
{
case HasMetaDataResult.FALSE: continue;
case HasMetaDataResult.TRUE(metaValues):
var metaField = new MetaField(fieldString, metaValues);
metaFieldSet.push(metaField);
}
}
return metaFieldSet;
}
private static function hasMetaData(metaFields:Dynamic<Dynamic<Array<Dynamic>>>, fieldString:String, metaLabel:String):HasMetaDataResult
{
var fieldProperty = Reflect.getProperty(metaFields, fieldString);
var metaLabels = Reflect.fields(fieldProperty);
for(checkedMetaDataName in metaLabels)
{
if(checkedMetaDataName == metaLabel){
var metaValues = Reflect.getProperty(fieldProperty, checkedMetaDataName);
return HasMetaDataResult.TRUE(metaValues);
}
}
return HasMetaDataResult.FALSE;
}
}
private enum HasMetaDataResult
{
TRUE(metaValues:Array<Dynamic>);
FALSE;
}
@siratama
Copy link
Author

siratama commented Oct 5, 2015

HowToUse

using com.dango_itimi.utils.MetaUtil;
class Test
{
    @message public var message1:String;
    @message public var message2:String;

    @list(1, 2, 3) public var list1:Array<Int>;
    @list(4, 5, 6) public var list2:Array<Int>;

    public function new()
    {
        createMessage();
        createList();
    }
    private function createMessage()
    {
        var metaFieldSet = Test.getMetaFields("message");
        for(metaField in metaFieldSet)
        {
            var string = "abc";
            Reflect.setProperty(this, metaField.name, string);
        }
        trace(message1); //abc
        trace(message2); //abc
    }
    private function createList()
    {
        var metaFieldSet = Test.getMetaFields("list");
        for(metaField in metaFieldSet)
        {
            var arr = metaField.value;
            Reflect.setProperty(this, metaField.name, arr);
        }
        trace(list1); //1, 2, 3
        trace(list2); //4, 5, 6
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment