class Origami::PDF::Instruction

def get_operands(operator)

def get_operands(operator)
    @insns[operator][:operands]
end

def get_render_proc(operator)

def get_render_proc(operator)
    @insns[operator][:render]
end

def has_op?(operator)

def has_op?(operator)
    @insns.has_key? operator
end

def initialize(operator, *operands)

def initialize(operator, *operands)
    @operator = operator
    @operands = operands.map!{|arg| arg.is_a?(Origami::Object) ? arg.value : arg}
    if self.class.has_op?(operator)
        opdef = self.class.get_operands(operator)
        if not opdef.include?('*') and opdef.size != operands.size
            raise InvalidPDFInstructionError,
                    "Numbers of operands mismatch for #{operator}: #{operands.inspect}"
        end
    end
end

def insn(operator, *operands, &render_proc)

def insn(operator, *operands, &render_proc)
    @insns[operator] = {}
    @insns[operator][:operands] = operands
    @insns[operator][:render] = render_proc || lambda{}
end

def parse(stream)

def parse(stream)
    operands = []
    while type = Object.typeof(stream, true)
        operands.push type.parse(stream)
    end
    if not stream.eos?
        if stream.scan(/(?<operator>[[:graph:]&&[^\[\]<>()%\/]]+)/).nil?
            raise InvalidPDFInstructionError, "Operator: #{(stream.peek(10) + '...').inspect}"
        end
        operator = stream['operator']
        PDF::Instruction.new(operator, *operands)
    else
        unless operands.empty?
            raise InvalidPDFInstructionError, "No operator given for operands: #{operands.map(&:to_s).join(' ')}"
        end
    end
end

def render(canvas)

def render(canvas)
    self.class.get_render_proc(@operator)[canvas, *@operands]
    self
end

def to_s

def to_s
    "#{operands.map{|op| op.to_o.to_s}.join(' ')}#{' ' unless operands.empty?}#{operator}\n"
end