I have a pattern that I frequently use, and I'm considering writing a macro 
to automate it, but figured I'd check if it exists already.

I frequently want to have the equivalent of an existing type functionally, 
but I want to be able to either dispatch on it or include additional fields 
for other purposes.  An example is wrapping a dictionary:

julia> immutable MyDict{K,V} <: Associative{K,V}
         d::Dict{K,V}
         otherfield::Int
       end


julia> md = MyDict(Dict(:x=>1), 10)
Error showing value of type MyDict{Symbol,Int64}:
ERROR: MethodError: `length` has no method matching length(::MyDict{Symbol,
Int64})


julia> md[:x]
ERROR: MethodError: `get` has no method matching get(::MyDict{Symbol,Int64}, 
::Symbol, ::Symbol)
Closest candidates are:
  get(::ObjectIdDict, ::ANY, ::ANY)
  get{K,V}(::Dict{K,V}, ::Any, ::Any)
  get{K}(::WeakKeyDict{K,V}, ::Any, ::Any)
  ...
 in getindex at dict.jl:282
 in eval at REPL.jl:3


julia> Base.length(md::MyDict) = length(md.d)
length (generic function with 111 methods)


julia> md
MyDict{Symbol,Int64} with 1 entryError showing value of type MyDict{Symbol,
Int64}:
ERROR: MethodError: `start` has no method matching start(::MyDict{Symbol,
Int64})
 in isempty at iterator.jl:3
 in showdict at dict.jl:93
 in writemime at replutil.jl:36
 in display at REPL.jl:114
 in display at REPL.jl:117
 [inlined code] from multimedia.jl:151
 in display at multimedia.jl:163
 in print_response at REPL.jl:134
 in print_response at REPL.jl:121
 in anonymous at REPL.jl:624
 in run_interface at ./LineEdit.jl:1610
 in run_frontend at ./REPL.jl:863
 in run_repl at ./REPL.jl:167
 in _start at ./client.jl:420

# the pain continues...



I'd like to be able to automatically do "md[:x]" and have it work, but 
instead I have to define a bunch of Base methods where I simply re-call the 
method with "md.d".

The macro I have in mind would grab the immediate supertype of the type in 
question, make the new type a subtype of that supertype, and then define 
pass-through methods for anything in the "methodswith(Dict)" list.

Does this exist already?  Could I get myself in trouble somehow by defining 
pass-through methods like this?

Thanks!
Tom

Reply via email to