class runner { public: runner(char *s, runner *x = 0) : str(s), _runner(x) { } virtual void process(attribute& p) { } virtual void run() { string_converter cv(str); for( int i = 1; i <= cv.argc(); i++ ) { attribute p( cv[i] ); self()->process(p); } } virtual void execute(ostream&) { } virtual int operator()(ostream& out) { self()->run(); self()->execute(out); return 1; } virtual runner* self() { return _runner?_runner:this; } private: char* str; runner* _runner; };