class bank_machine { messaging::receiver incoming; unsigned balance; public: bank_machine() : balance(199) {} void done() { get_sender().send(messaging::close_queue()); } void run() { try { for (;;) { incoming.wait() .handle([&](verify_pin const& msg) { if (msg.pin == "1937") { msg.atm_queue.send(pin_verified()); } else { msg.atm_queue.send(pin_incorrect()); } }) .handle([&](withdraw const& msg) { if (balance >= msg.amount) { msg.atm_queue.send(withdraw_ok()); balance -= msg.amount; } else { msg.atm_queue.send(withdraw_denied()); } }) .handle([&](get_balance const& msg) { msg.atm_queue.send(::balance(balance)); }) .handle( [&](withdrawal_processed const& msg) {}) .handle([&](cancel_withdrawal const& msg) {}); } } catch (messaging::close_queue const&) { } } messaging::sender get_sender() { return incoming; } };