The USE ARG instruction is essentially a glorified assignment instruction. However, it only supports assignment to regular variables. To make an assignment using the message term syntax, you need to use a temporary variable or revert to using the arg() instruction.
use arg self~attribute
doesn't work. You need to do either
use arg temp
self~attribute = temp
self~attribute = arg(1)
NOTE: The one difference here will need to be the behavior for omitted arguments. With a variable case, the variable is dropped. That concept doesn't exist for the message terms. Note that the two cases above have different behaviors for omitted args. The temp variable case assigns the attribute to TEMP, while the arg() BIF case assigns it to "". I suspect the ARG() case is probably the desired effect.