sub what_does_it_return () return classA | classH { return rand(1) > 0.5 ? bless( [], 'classA' ) : bless( {}, 'classH' ); } #### my classA | classH $x = what_does_it_return(); #### $x->something() #### package classA; sub something (classA $self) { ... } #### sub what_does_it_return () return classX { return rand(1) > 0.5 ? bless( [], 'classA' ) : bless( {}, 'classH' ); } #### my classX $x = what_does_it_return(); $x->something() # compile-time blowup, classX doesn't have the "something" method!