import morfa.base; template public struct Dynamic { var data: Dict; } // convenience to create new Dynamic instances template public property dynamic(): Dynamic { return Dynamic(new Dict()); } // introduce replacement operator for . - a quoting ` operator public operator ` { kind = infix, precedence = max, associativity = left, quoting = right } template public func `(d: Dynamic, name: text): DynamicElementAccess { return DynamicElementAccess(d, name); } // to allow implicit cast from the wrapped instance of T (on access) template public func convert(dea: DynamicElementAccess): T { return dea.holder.data[dea.name]; } // cannot overload assignment - introduce special assignment operator public operator <- { kind = infix, precedence = assign } template public func <-(access: DynamicElementAccess, newEl: T): void { access.holder.data[access.name] = newEl; } func main(): void { var test = dynamic; test`a <- 10; test`b <- 20; test`a <- 30; println(test`a, test`b); } // private helper structure template struct DynamicElementAccess { var holder: Dynamic; var name: text; import morfa.io.format.Formatter; public func format(formatt: text, formatter: Formatter): text { return getFormatFunction(holder.data[name])(formatt, formatter); } }