Can you just override to a new template which has additional logic in it?
So instead of using an override to determine the display method, use the template itself to do the more complex checking. ie
{section show=one set of rules}
display stuff
{/section}
{section show=another set of rules}
another set of display stuff
{/section}
Thanks, that's what I've wound up doing! Here's the final template if anyone's interested. It changes to inline mode for files, but for everything else uses the default 3.5 object.tpl code:
{* displays as inline or block-level based on the embedded object''s class *}
{switch match=$object.contentclass_id}
{case match='12'}{*
files display as inline
*}
{set-block scope=root variable=is_block}false{/set-block}
{content_view_gui view=$view object_parameters=$object_parameters attribute_parameters=$object_parameters content_object=$object}
{/case}
{case}{*
everything else display as block using standard eZ object.tpl
*}
{let object_align='right'}
{switch match=$object_parameters.align}
{case match='left'}
{set object_align='left'}
{/case}
{case match='right'}
{set object_align='right'}
{/case}
{case match='center'}
{set object_align='center'}
{/case}
{case/}
{/switch}
<div class="object-{$object_align}{section show=ne($classification|trim,'')} {$classification|wash}{/section}">
{content_view_gui view=$view object_parameters=$object_parameters attribute_parameters=$object_parameters content_object=$object}
</div>
{/let}
{*
Set variable to true if the object should be rendered as a block
tag. If it should be rendered as inline use false.
{set-block scope=root variable=is_block}true{/set-block}
*}
{/case}
{/switch}