def process_p p
            @viewer.receive_p p if @viewer
            if p.action!=Edoors::ACT_ERROR and p.action!=Edoors::ACT_PASS_THROUGH
                p2 = @postponed[p.link_value] ||= p
                return if p2==p
                @postponed.delete p.link_value
                p,p2 = p2,p if p.action==Edoors::ACT_FOLLOW
                p.merge! p2
            end
            @saved = p
            receive_p p
            _garbage if not @saved.nil?
        end
def process_p p
            @viewer.receive_p p if @viewer
            if p.action!=Edoors::ACT_ERROR and p.action!=Edoors::ACT_PASS_THROUGH
                p2 = @postponed[p.link_value] ||= p
                return if p2==p
                @postponed.delete p.link_value
                p,p2 = p2,p if p.action==Edoors::ACT_FOLLOW
                p.merge! p2
            end
            @saved = p
            receive_p p
            _garbage if not @saved.nil?
        end
process the given particle then forward it to user code

 @param [Particle] p the Particle to be processed