OutboundPacketStream& OutboundPacketStream::operator<<( const BeginMessage& rhs )
{
    if( IsMessageInProgress() )
        throw MessageInProgressException();

    CheckForAvailableMessageSpace( rhs.addressPattern );

    messageCursor_ = BeginElement( messageCursor_ );

    strcpy( messageCursor_, rhs.addressPattern );
    unsigned long rhsLength = strlen(rhs.addressPattern);
    messageCursor_ += rhsLength + 1;

    // zero pad to 4-byte boundary
    unsigned long i = rhsLength + 1;
    while( i & 0x3 ){
        *messageCursor_++ = '\0';
        ++i;
    }

    argumentCurrent_ = messageCursor_;
    typeTagsCurrent_ = end_;

    messageIsInProgress_ = true;

    return *this;
}
OutboundPacketStream& OutboundPacketStream::operator<<( const BeginMessage& rhs )
{
    check( !IsMessageInProgress() )

    state_ = CheckForAvailableMessageSpace( rhs.addressPattern );

    if(state_ == SUCCESS)
    {
        messageCursor_ = BeginElement( messageCursor_ );

        std::strcpy( messageCursor_, rhs.addressPattern );
        std::size_t rhsLength = std::strlen(rhs.addressPattern);
        messageCursor_ += rhsLength + 1;

        // zero pad to 4-byte boundary
        std::size_t i = rhsLength + 1;
        while( i & 0x3 ){
            *messageCursor_++ = '\0';
            ++i;
        }

        argumentCurrent_ = messageCursor_;
        typeTagsCurrent_ = end_;

        messageIsInProgress_ = true;
    }

    return *this;
}