Skip to content

Instantly share code, notes, and snippets.

@rjungemann
Created February 3, 2010 23:16
Show Gist options
  • Save rjungemann/294170 to your computer and use it in GitHub Desktop.
Save rjungemann/294170 to your computer and use it in GitHub Desktop.
A generic locator class for ActionScript
package com.thefifthcircuit.utils {
public class Locator {
private static var obj:* = {};
private function shallowGet(query:String):* {
var parsed:String = "^" + query + "$";
var matches:Array = [];
for(var key:String in obj) {
if(key.match(new RegExp(parsed))) {
matches.push(obj[key])
}
}
return matches[0];
}
private function shallowSet(query:String, value:*):* {
var parsed:String = "^" + query + "$";
var matches:Array = [];
for(var key:String in obj) {
if(key.match(new RegExp(parsed))) {
obj[key] = value;
matches.push(obj[key]);
}
}
if(matches.length < 1) {
obj[query] = value;
}
return value;
}
private function deepGet(query:String):* {
var keys:Array = query.split("/");
var currentObj:* = obj;
for(var i = 0; i < keys.length; i++) {
var val:* = shallowGet(currentObj, keys[i]);
currentObj = val;
if(val == null || val == undefined) break;
}
var value:* = currentObj;
return (i < keys.length - 1) ? null : value;
}
private function deepSet(query:String, value:*):* {
var keys:Array = query.split("/");
var currentObj:* = obj;
for(var i = 0; i < keys.length; i++) {
var val:* = shallowGet(currentObj, keys[i]);
if(val == null || val == undefined) break;
else currentObj = val;
}
var value:* = (i < keys.length - 1) ? null :
shallowSet(currentObj, keys[keys.length - 1], value);
return value;
}
public static function $(query:String, value:* = undefined):* {
return(value == undefined ? deepGet(obj, query) : deepSet(obj, query, value));
}
}
}
// Locator.$ can take 1 or 2 arguments (getter ver. or the setter ver.)
// * path (a string containing "/"-delimited tokens, each of which can be a
// string or regexp)
// * object (any object to place at the particular path)
//
// Locator.$("foo", {});
// Locator.$("foo/new", {});
// Locator.$("foo/new/hello-whee", "bar");
// trace(Locator.$("foo/.*/hello-whee"));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment