#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;
BEGIN {
    plan skip_all => 
            "This test requires Class::Method::Modifiers or Class::Method::Modifiers::Fast" 
        unless eval { 
            require Class::Method::Modifiers::Fast;
        } or   eval {
            require Class::Method::Modifiers;
        };
}

plan tests => 6;


# this test script ensures that my idiom of:
# role: sub BUILD, after BUILD
# continues to work to run code after object initialization, whether the class
# has a BUILD method or not

my @CALLS;

do {
    package TestRole;
    use Mouse::Role;

    sub BUILD           { push @CALLS, 'TestRole::BUILD' }
    before BUILD => sub { push @CALLS, 'TestRole::BUILD:before' };
    after  BUILD => sub { push @CALLS, 'TestRole::BUILD:after' };
};

do {
    package ClassWithBUILD;
    use Mouse;
    with 'TestRole';

    sub BUILD { push @CALLS, 'ClassWithBUILD::BUILD' }
};

do {
    package ClassWithoutBUILD;
    use Mouse;
    with 'TestRole';
};

is_deeply([splice @CALLS], [], "no calls to BUILD yet");

ClassWithBUILD->new;

is_deeply([splice @CALLS], [
    'TestRole::BUILD:before',
    'ClassWithBUILD::BUILD',
    'TestRole::BUILD:after',
]);

ClassWithoutBUILD->new;

is_deeply([splice @CALLS], [
    'TestRole::BUILD:before',
    'TestRole::BUILD',
    'TestRole::BUILD:after',
]);

ClassWithBUILD->meta->make_immutable;
ClassWithoutBUILD->meta->make_immutable;

is_deeply([splice @CALLS], [], "no calls to BUILD yet");

ClassWithBUILD->new;

is_deeply([splice @CALLS], [
    'TestRole::BUILD:before',
    'ClassWithBUILD::BUILD',
    'TestRole::BUILD:after',
]);

ClassWithoutBUILD->new;

is_deeply([splice @CALLS], [
    'TestRole::BUILD:before',
    'TestRole::BUILD',
    'TestRole::BUILD:after',
]);

