A few years ago I would have tried implementing this kind of thing using an appliable module with its own overloading exports for arithmetic, etc. It's a pretty good approach, but it has its drawbacks. One issue (which is seen with Units, say) is that the rebound arithmetic operators and other exports only have an effect when used at the top-level. System commands saved in the system library archives have the original global names bound for those operators, and so they don't utilize the redefined or overloaded versions.
Some of these kinds of issues can be alleviated by using the newer objects in Maple. In the attached Document I put a preliminary definition of a phasor-style object in the Startup Code region.
I named my class of phasor objects using the name `∠` so that that entry in the Operators Palette would work. (I suspect that could be similarly useful as the name of Carl's appliable module as well.)
Please let me know if I didn't get some of the math right, or if you have a suggestion. I'm sure that this could be improved.
I used the palette to enter the prettyprinted angle symbol in 2D Input mode. I'd have to investigate whether I could teach it to command-completion also, for pure typing input.
Here's that first shot at the code for it, from that document's Startup Code region. Sorry if any of the angle names in this 1D plaintext code get rendered like the typeset entity -- it's a problem with this site for code within pre-tags. (I already see something to improve, the case when it gets called with no arguments.)
option object, `Copyright (c) 2015 by R. Acer. All rights reserved.`;
local ModulePrint, larg, labs;
if nargs=3 then (new:-labs,new:-larg):=1,v;
elif nargs=4 then (new:-labs,new:-larg):=args,args;
else error "invalid arguments"; end if;
export argument::static:=proc(a) a:-larg; end proc;
export abs::static:=proc(a) a:-labs; end proc;
if nargs=1 then return args;
R:=add(abs(z)*exp(argument(z)*Pi*I/180),z=a) + add(z,z=o);
R:=mul(abs(z)*exp(argument(z)*Pi*I/180),z=a) * mul(z,z=o);