use strictures 1; use Test::More; { package t::moo::extends_non_moo::base; sub new { my ($proto, $args) = @_; bless $args, $proto; } sub to_app { (shift)->{app}; } package t::moo::extends_non_moo::middle; use base qw(t::moo::extends_non_moo::base); sub wrap { my($class, $app) = @_; $class->new({app => $app}) ->to_app; } package t::moo::extends_non_moo::moo; use Moo; extends 't::moo::extends_non_moo::middle'; package t::moo::extends_non_moo::moo_with_attr; use Moo; extends 't::moo::extends_non_moo::middle'; has 'attr' => (is=>'ro'); package t::moo::extends_non_moo::second_level_moo; use Moo; extends 't::moo::extends_non_moo::moo_with_attr'; has 'attr2' => (is=>'ro'); } ok my $app = 100, 'prepared $app'; ok $app = t::moo::extends_non_moo::middle->wrap($app), '$app from $app'; is $app, 100, '$app still 100'; ok $app = t::moo::extends_non_moo::moo->wrap($app), '$app from $app'; is $app, 100, '$app still 100'; ok $app = t::moo::extends_non_moo::moo_with_attr->wrap($app), '$app from $app'; is $app, 100, '$app still 100'; ok $app = t::moo::extends_non_moo::second_level_moo->wrap($app), '$app from $app'; is $app, 100, '$app still 100'; done_testing();