The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test;
BEGIN { plan tests => 4 }


{

  package HelloWorld; 
  sub hello { return "Hello World!" }
  
  package HelloWorld::UpperCase;
  sub hello { uc( (shift)->NEXT('hello', @_) ) }
  
  package HelloWorld::Bold;
  sub hello { "<b>" . (shift)->NEXT('hello', @_) . "</b>" }
  
  package HelloWorld::Italic;
  sub hello { "<i>" . (shift)->NEXT('hello', @_) . "</i>" }

  package HelloWorld::Factory;
  use Class::MixinFactory -isafactory;
  BEGIN { $INC{"HelloWorld/Factory.pm"} = __FILE__ }
  BEGIN { HelloWorld::Factory->base_class( "HelloWorld" ) }

}

{ 
  package My::FirstStyle; 
  use Class::MixinFactory -isasubclass => HelloWorld::Factory => 'UpperCase';
  sub hello { "* " . (shift)->NEXT('hello', @_) . " *" }

  package My::SecondStyle; 
  use Class::MixinFactory -isasubclass => HelloWorld::Factory => 'Bold', 'Italic';
  sub hello { "* " . (shift)->NEXT('hello', @_) . " *" }

  package My::ThirdStyle; 
  use Class::MixinFactory -isasubclass => HelloWorld::Factory => 'Bold', 'UpperCase';
  sub hello { "* " . (shift)->NEXT('hello', @_) . " *" }
}

package main;

ok( HelloWorld->hello(), 'Hello World!' );

ok( My::FirstStyle->hello(), '* HELLO WORLD! *' );
ok( My::SecondStyle->hello(), '* <b><i>Hello World!</i></b> *' );
ok( My::ThirdStyle->hello(), '* <b>HELLO WORLD!</b> *' );