protected function mapObjectToElementName(Mapper_Mapable $subject)
    {
        // Pick a default value based on the subject class
        $name = substr(get_class($subject), strlen(__NAMESPACE__) + 1);

        // See if the objectMapper array contains the (super)class
        foreach ($this->objectMapper as $key => $class) {
            if ($subject instanceof $class) {
                $name = $key;
                break;
            }
        }

        // Map the name to a proper key
        $name = $this->propertyToKey($name);

        // Get rid of the unnecessary type specs (i.e. invoice_detail => detail)
        $simplified = array(
            'payment', 'history', 'detail',
        );
        foreach ($simplified as $simplify) {
            $name = preg_replace('/^[a-z\-\/]+[_\/](' . preg_quote($simplify) . ')/', '\\1', $name);
        }

        if ($subject instanceof SyncObject) {
            $name = 'ids';
        }

        $pos = ($subject instanceof SyncArray) ? strpos($name, '_') : strrpos($name, '_');
        if ($pos !== false) {
            $name = substr($name, 0, $pos);
        }
        if ($subject instanceof ArrayObject && substr($name, -1) != 's') {
            $name .= 's';
        }

        // Exceptions
        $name = str_replace(
            array(
            'historys',
            'details',
            'incoming-invoice',
            ), array(
            'history',
            'details_attributes',
            'incoming_invoice',
            ), $name
        );

        return lcfirst($name);
    }